InputInput contains multiple test cases. Each line contains two integer n, m (0<n,m<=2000). The input is terminated when n=0 and m=0.
OutputIf kiki wins the game printf "Wonderful!", else "What a pity!".
Sample Input
5 3 5 4 6 6 0 0
Sample Output
What a pity! Wonderful! Wonderful!
最后一个点一定是必败点,能一步到必败点的点一定是必胜点,只能到必胜点的点一定是必败点。
如此,就可以推出来全部的点
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 int n,m; 6 bool f[2010][2010]; 7 bool v[2010][2010]; 8 int dfs(int x,int y) 9 { 10 // cout<<x<<" "<<y<<endl; 11 if (v[x][y]) return f[x][y]; 12 int a1=1,a2=1,a3=1; 13 if ((y-1)>0&&x) a1=dfs(x,y-1); 14 if ((x+1)<=n&&y) a2=dfs(x+1,y); 15 if ((x+1)<=n&&(y-1)>0) a3=dfs(x+1,y-1); 16 bool s=(a1&&a2&&a3); 17 f[x][y]=!s; 18 v[x][y]=1; 19 if (!s) { 20 return 1;} 21 else 22 { 23 return 0; 24 } 25 } 26 int main() 27 { 28 n=2000; 29 dfs(0,2000); 30 while(cin>>n>>m&&n&&m) 31 { 32 bool ans=f[2001-n][m]; 33 if (ans) 34 { 35 cout<<"Wonderful!\n"; 36 } 37 else 38 { 39 cout<<"What a pity!\n"; 40 } 41 } 42 return 0; 43 }
原文:http://www.cnblogs.com/xfww/p/7273098.html