题目传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=2147
P点:就是P个石子的时候,对方拿可以赢(自己输的)
N点:就是N个石子的时候,自己拿可以赢
现在关于P,N的求解有三个规则
(1):最终态都是P
(2):按照游戏规则,到达当前态的前态都是N的话,当前态是P
(3):按照游戏规则,到达当前态的前态至少有一个P的话,当前态是N
题意:
在一个m*n的棋盘内,从(1,m)点出发,每次可以进行的移动是:左移一,下移一,左下移一。然后kiki每次先走,判断kiki时候会赢(对方无路可走的时候)。
打表代码:
#include<iostream>
using namespace std;
bool map[2001][2001];//1 P 0 N;
int main()
{
int i,j,k;
map[1][1]=1;
for(i=2;i<=2000;i++)
{
if(map[i-1][1])
map[i][1]=0;
else map[i][1]=1;
for(j=2;j<i;j++)
{
if(!map[i][j-1]&&!map[i-1][j-1]&&!map[i-1][j])
map[i][j]=1;
else map[i][j]=0;
}
if(map[1][i-1])
map[1][i]=0;
else map[1][i]=1;
for(j=2;j<i;j++)
{
if(!map[j-1][i]&&!map[j-1][i-1]&&!map[j][i-1])
map[j][i]=1;
else map[j][i]=0;
}
if(!map[i][i-1]&&!map[i-1][i-1]&&!map[i-1][i])
map[i][i]=1;
else map[i][i]=0;
}
int M,N;
for(i=1;i<=10;i++){
for(j=1;j<=10;j++)
printf("%c ",map[i][j]?'P':'N');
printf("\n");
}
return 0;
}
找出规律之后一切都很好说~
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main (void)
{
int t;
int flag;
//cin>>t;
int n,m;
while(~scanf("%d %d",&n,&m))
{
if(n==0&&m==0)
break;
flag=0;
if(n%2&&m%2)
{
printf("What a pity!\n");
continue;
}
printf("Wonderful!\n");
}
return 0;
}