【模拟】游戏(jzoj 1614)

版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/ssllyf/article/details/86618397

游戏

题目大意:

有一个n*n的棋盘,有一个坐标在x,y的棋子, 1、2号玩家可以将他向左,向下,向左下( 4 5 45^{\circ} )移动若干格,假如他们都是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;
}

猜你喜欢

转载自blog.csdn.net/ssllyf/article/details/86618397