思路正确,但超时
超时代码:
#include <iostream>
using namespace std;
int map[2001][2001];
int NOok(int x,int y)
{
if(map[x-1][y] && map[x][y-1] && map[x-1][y-1])//只能向上、左、上左走。三方向同时为N则当前点必为P
return 1;
return 0;
}
main()
{
int m,n;
int i,j;
while(scanf("%d%d",&n,&m),n)
{
for(i=0;i<=n;i++)//从下标1开始防越界外围全为N必胜,1代表N
map[i][0]=1;
for(i=0;i<=m;i++)
map[0][i]=1;
//map[1][1]=-1;
for(i=1;i<=n;i++)//相当于从(n,m)走到(1,1)。(1,1)为P
for(j=1;j<=m;j++)
{
if(NOok(i,j))
map[i][j]=0;//p
else
map[i][j]=1;//N
}
if(map[n][m])
cout<<"Wonderful!"<<endl;
else
cout<<"What a pity!"<<endl;
}
}
要找规律:
必败局面都出现在横纵坐标都为奇数的位置
#include<iostream>
using namespace std;
int main()
{
int n, m;
while(scanf("%d%d", &n, &m))
{
if(n == 0 || m == 0)
break;
if(n % 2 == 0 || m % 2 == 0)
{
printf("Wonderful!\n");
}
else
printf("What a pity!\n");
}
}