游戏
题目大意:
有一个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;
}