zoj 3057 Beans Game (三維博弈)
阿新 • • 發佈:2018-11-05
題目連結:zoj 3057
題意:給三堆石頭,每次可以任選一堆(或者兩堆)取任意石子,取走最後一個石子的獲勝。
參考連結:https://blog.csdn.net/David_Jett/article/details/47296567?utm_source=blogxgwz0
題解:直接暴力解決了,開三維陣列,詳情見程式碼。
///博弈,每個狀態要麼是必勝態,要麼就是必敗態 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=310; bool win[maxn][maxn][maxn]; int mins(int a,int b){ return a<b?a:b; } void init() { win[0][0][0]=0;///初始化,必敗態 for(int i=0;i<=300;i++) { for(int j=0;j<=300;j++) { for(int k=0;k<=300;k++) { if(!win[i][j][k]){ for(int m=300-i;m;m--) win[i+m][j][k]=1; ///表示可以在第一堆取走m個,使得下一個人面對必敗態 for(int m=300-j;m;m--) win[i][j+m][k]=1; for(int m=300-k;m;m--) win[i][j][k+m]=1; for(int m=mins(300-i,300-j);m;m--) win[i+m][j+m][k]=1; ///表示可以在第一堆和第二堆取走m個,使得下一個人面對必敗態 for(int m=mins(300-i,300-k);m;m--) win[i+m][j][k+m]=1; for(int m=mins(300-j,300-k);m;m--) win[i][j+m][k+m]=1; } } } } } int main() { int a,b,c; init(); while(~scanf("%d%d%d",&a,&b,&c)) { if(win[a][b][c]) printf("1\n"); else printf("0\n"); } return 0; }