您的位置:首页 > 其它

hdu 2147 kiki's game(DP(SG)打表找规律)

2014-10-01 20:35 423 查看
题意:

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
[m]!=-1) return f
[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
[m] = 0;
if(a2>=1 && b2>=1 && go(a2,b2)==1) return f
[m] = 0;
if(a3>=1 && b3>=1 && go(a3,b3)==1) return f
[m] = 0;
return f
[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!");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: