版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86618397
游戏
题目大意:
有一个n*n的棋盘,有一个坐标在x,y的棋子, 1、2号玩家可以将他向左,向下,向左下(
)移动若干格,假如他们都是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;
}