题意:
有3堆大豆,每次可以从一堆取至少一个或者从两堆中去相同个数,0,0,0为终止状态。判断谁能够胜利。
题解:
表示当前三堆数量分别为i,j,k的大豆处于必胜态,否则处于必败态。
若,为必败态,则:
- 、、 为必胜态,因为先手只需拿去x,剩下的就变为必败态。
- 、、 为必胜态,同理。
代码:
#include <bits/stdc++.h> #define clr(str,x) memset(str,x,sizeof(str)) #define FRER() freopen("in.txt","r",stdin); #define FREW() freopen("out.txt","w",stdout); #define MAX_INF 0x7fffffff #define INF 0x3f3f3f3f #define maxn 310 using namespace std; typedef long long int ll; bool dp[maxn][maxn][maxn]; void Get() { clr(dp,0); for(int i=0; i<=300; i++) { for(int j=0; j<=300; j++) { for(int k=0; k<=300; k++) { if(!dp[i][j][k]) { for(int ti=i+1; ti<=300; ti++) dp[ti][j][k]=1; for(int tj=j+1; tj<=300; tj++) dp[i][tj][k]=1; for(int tk=k+1; tk<=300; tk++) dp[i][j][tk]=1; for(int t=1; t+i<=300&&t+j<=300; t++) dp[t+i][t+j][k]=1; for(int t=1; t+k<=300&&t+i<=300; t++) dp[t+i][j][t+k]=1; for(int t=1; t+j<=300&&t+k<=300; t++) dp[i][t+j][t+k]=1; } } } } } int main() { Get(); int a,b,c; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { printf("%d\n",dp[a][b][c]); } return 0; }