游戏
 
题目大意:
 
有一个n*n的棋盘,有一个坐标在x,y的棋子, 1、2号玩家可以将他向左,向下,向左下(45∘45^{\circ}45∘)移动若干格,假如他们都是AKIOI聪明绝顶的巨佬,请问1号玩家先出,谁可以将棋子移到1,1,他的x是从上往下的
 
样例输入
 
6
 
2 4
 
样例输出
 
2
 
数据范围限制
 
提示
 
数据说明:
 
30% N<=500
 
50% N<=2000
 
80% N<=10000
 
100% N<=100000 1<=I,J<=N
 
解题思路:
 
这到题一看就是一道难题,就连身为蒟蒻的我也不会做,然后想到了一种DP的方法,结果↓
 

 
呵呵,我真菜(×1),然后等巨佬讲题后……
 
哇,原来是找规律啊,我真菜(×2),我竟然想不到,我真菜(×3)
 
回归正题,发现的规律是:
 
第一个结果是2是2+1,2||2,2+1
 
第二个结果是2是4+2,4||4,4+2
 
第三个结果是2是5+3,5||5,5+3
 
第四个结果是2是7+4,7||7,7+4
 
可以发现其中一个坐标要增加的数字是1,2,3,4,5,6,7……,而本身的数字就是在增加的一串数字,但他不能被前面的数字相加而成,如2+4=6,所以没有6
 
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,x,y,t,j;
bool p[100005];
int main()
{freopen("game.in","r",stdin);freopen("game.out","w",stdout);while(~scanf("%d %d %d",&n,&y,&x)){x=n-x+1;t=1;memset(p,false,sizeof(p));j=0;for (int i=1;i+j<=n;i++)if (!p[i]){p[i]=true;if (((x==i)&&(y==i+j))||((x==i+j)&&(y==i))){t=2;break;}p[i+j]=true;j++;}printf("%d\n",t);}fclose(stdin);fclose(stdout);return 0;
}