zoj 3057 博弈
思路:对于TT来说,如果数量分别为a a b或 a b a,或 b a a的形式,那么TT必赢,因为TT可以使其成为 a a a的形式,那么不论DD 怎么拿,都是TT最后使其成为a a a 的形式,0 0 0也是a a a的形式,故TT胜。同样,存在必败局。如果a,b,c是先手的必败局,那么将其中某个数加k,或将其中某两个数同时加k,那么就成了先手的必胜局。
#include<set> #include<map> #include<cmath> #include<queue> #include<cstdio> #include<vector> #include<string> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pb push_back #define mp make_pair #define Maxn 100010 #define Maxm 200010 #define LL __int64 #define Abs(x) ((x)>0?(x):(-x)) #define lson(x) (x<<1) #define rson(x) (x<<1|1) #define inf 100000 #define lowbit(x) (x&(-x)) #define clr(x,y) memset(x,y,sizeof(x)) #define Mod 1000000007 using namespace std; bool dp[301][301][301]; void init() { int i,j,k,r; dp[0][0][0]=1; for(i=0;i<=300;i++){ for(j=0;j<=300;j++){ for(k=0;k<=300;k++){ if((i!=j||i!=k||j!=k)&&(i==j||i==k||j==k)){ dp[i][j][k]=1; continue; } if(!dp[i][j][k]){ for(r=1;r<=300;r++){ if(i+r<=300) dp[i+r][j][k]=1; if(j+r<=300) dp[i][j+r][k]=1; if(k+r<=300) dp[i][j][k+r]=1; if(i+r<=300&&j+r<=300) dp[i+r][j+r][k]=1; if(i+r<=300&&k+r<=300) dp[i+r][j][k+r]=1; if(j+r<=300&&k+r<=300) dp[i][j+r][k+r]=1; } } } } } } int main() { int a,b,c; init(); while(scanf("%d%d%d",&a,&b,&c)!=EOF){ printf("%d\n",dp[a][b][c]); } return 0; }