题意:
n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边。
无法移动硬币的人负。
给出n和m,问,先手胜还是后手胜。
数据范围:
n, m (0<n,m<=2000)
思路:
dp[i][j]=0,说明从(i,j)这个点到时左下角先手败。dp[i][j]=1则先手胜。
然后记忆搜。但是记忆搜会超时。
搜完把整张表打出来,发现规律了,,,,然后,,,代码剩几行了。
代码:
///打表观察 /* int f[2005][2005]; int go(int n,int m){ //0:必败 1:必胜 if(f[n][m]!=-1) return f[n][m]; int a1 = n-1, b1 = m; int a2 = n, b2 = m-1; int a3 = n-1,b3 = m-1; if(a1>=1 && b1>=1 && go(a1,b1)==1) return f[n][m] = 0; if(a2>=1 && b2>=1 && go(a2,b2)==1) return f[n][m] = 0; if(a3>=1 && b3>=1 && go(a3,b3)==1) return f[n][m] = 0; return f[n][m] = 1; } */ int main(){ int n,m; while(scanf("%d%d",&n,&m),n||m){ /* rep(i,1,n) rep(j,1,m) f[i][j] = -1; f[1][1] = 0; go(n,m); rep(i,1,n){ rep(j,1,m) printf("%d",f[i][j]); cout<<endl; } */ if(n%2 && m%2) puts("What a pity!"); else puts("Wonderful!"); } }
hdu 2147 kiki's game(DP(SG)打表找规律)
时间: 2024-10-10 13:20:51