D - Game with a Strip URAL - 2104 -DFS-博弈
阿新 • • 發佈:2018-12-01
-
D - Game with a Strip
- URAL - 2104
- 題意:給定一個紙帶,長度為n寬為1,正反兩面都有n個正方形,每個正方形上有A,B兩個字母,輪流進行操作,
- ALICE先手,操作規則為如果長度為偶數則可以對摺,當操作到一種正反面全部為一個字母時遊戲結束,字母是誰誰贏
- 他們足夠聰明,當不符合規則,無法對摺時遊戲以平局結束。
- 思路:按照題意規則進行模擬,DFS進行這個過程,DFS返回值為這種狀態誰贏, 返回依據為,全是A了alice贏
- 全為B了Bob贏,無法對摺了返回平局,無法直接判斷時繼續遞迴下一次操作,直到能夠確定誰贏為止,返回值之後,
- 原來不能確定的也就能根據,當前操作的人是誰與下一步的返回的狀態來確定這一次是誰贏,總而言之就是,先遞迴
- 子狀態,再返回判斷。
-
#include<bits/stdc++.h> using namespace std; string str[5]; int n,ans; int dfs(string s1,string s2,int id) { int len=s1.size(),f1,f2,flag=1,flag2=1; for(int i=0; i<len; i++) { if(s1[i]=='A'||s2[i]=='A')flag=0; if(s1[i]=='B'||s2[i]=='B')flag2=0; } if(flag&&!flag2)return 1; else if(!flag&&flag2)return 0; else if(len%2)return 2; string ss1,ss2,ss3,ss4; for(int i=len/2-1; i>=0; i--) { ss1+=s1[i]; ss3+=s2[i]; } for(int i=len/2; i<len; i++) { ss2+=s1[i]; ss4+=s2[i]; } f1=dfs(ss1,ss2,id^1); f2=dfs(ss3,ss4,id^1); if(f1==id||f2==id) return id; else if(f1==2||f2==2) return 2; else return id^1; } int main() { cin>>n>>str[0]>>str[1]; ans=dfs(str[0],str[1],0); if(ans==0)printf("Alice\n"); else if(ans==1)printf("Bob\n"); else printf("Draw\n"); return 0; }