-
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; }
D - Game with a Strip URAL - 2104 -DFS-博弈
猜你喜欢
转载自blog.csdn.net/BePosit/article/details/84592384
今日推荐
周排行