博弈 敌对搜索

xiaoxiao2021-02-28  113

定义一种新的黑白棋:

1. 棋盘大小为5*5的格子;

2. 有些格子不能放棋子;

3. 同一个格子最多放一个棋子;

4. 先手执白棋,后手执黑棋;

5. 先手第一次可以把棋放在任意可以放的位置上;

6. 接下来两人轮流放棋子,这个棋子必须与上一个人放的棋子相邻

请问:两人都是最优策略,是先手赢,还是先手输?

深搜每层结果代表先手在对应状态下输赢(必胜必输态)。 状态分两种开始的任意下和之后每次要紧邻放。 #include<cstdio> #include<iostream> using namespace std; int a[10][10]; int _next[4][2]={0,1,1,0,0,-1,-1,0}; int dfs(int x,int y) { a[x][y]=1; for(int i=0;i<4;i++) { int tx=x+_next[i][0],ty=y+_next[i][1]; if(tx<1||tx>5||ty<1||ty>5||a[tx][ty]) continue; if(!dfs(tx,ty)) { a[x][y]=0; return 1; } } a[x][y]=0; return 0; } int main() { int t; scanf("%d",&t); while(t--) { for(int i=1;i<=5;i++) for(int j=1;j<=5;j++) scanf("",&a[i][j]); int flag=0; for(int i=1;i<=5&&!flag;i++) for(int j=1;j<=5&&!flag;j++) if(!a[i][j]&&!dfs(i,j)) flag=1; if(flag) printf("win\n"); else printf("lose\n"); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-40290.html

最新回复(0)