题意:给定三堆石子,每次可以在一堆取任意的石子或者选两堆取等量的石子,问先手是否必胜;
分析:博弈DP打表
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 301;
bool dp[N][N][N];
void init(){
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int z=0;z<N;z++){
if(dp[i][j][z]==0){ //能到达必败态的是必胜态
for(int x=1;x+i<N;x++){
dp[i+x][j][z]=1;
}
for(int x=1;x+j<N;x++){
dp[i][j+x][z]=1;
}
for(int x=1;x+z<N;x++){
dp[i][j][z+x]=1;
}
for(int x=1;x+i<N&&x+j<N;x++){
dp[i+x][j+x][z]=1;
}
for(int x=1;x+i<N&&x+z<N;x++){
dp[x+i][j][x+z]=1;
}
for(int x=1;x+j<N&&x+z<N;x++){
dp[i][j+x][z+x]=1;
}
}
}
}
int main(){
init();
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c)&&a+b+c){
printf("%d\n",dp[a][b][c]);
}
}