博弈搜索练习-BFS-秋神也玩亚马逊
来源:互联网 发布:淘宝瑕疵冰箱上当受骗 编辑:程序博客网 时间:2024/06/12 16:55
Problem Description
根据亚马逊棋估值方法判断当前局面下白方的估值得分。
Input
输入数据可能不止一组,每组测试样例间有一个空行,每组输入数据均有10行,每行10个字符,其中".”代表空棋格(没有棋子或障碍),"X”代表障碍,"W”代表白子,"R”代表黑子。
Output
输出白方局面评估的值,每个局面的估值包括:按照queen move标记,白方步数少于黑方步数的格子数与白方步数多于黑方步数格子数之差。
按照king move标记,白方步数少于黑方步数的格子数与白方步数多于黑方步数格子数之差。
每组输入数据所对应的输出结果占一行。
例
输入:
..XRX.....
..WXX.....
..XXRXXXX.
.XX.X.W.X.
X....X....
.XX..XXX..
...W...X..
.X.....W.X
...R..R...
X......X..
如图棋局输出应为:
case 1: queen win:3 king win:7
- ...R..R...↵
- ..........↵
- ..........↵
- R........R↵
- ..........↵
- ..........↵
- W........W↵
- ..........↵
- ..........↵
- ...W..W...↵
- ↵
- RXXXXXXXXX↵
- RXXXXXXXXX↵
- XXXXXXXXXX↵
- XXXXXXXXXR↵
- XXXX.RXXXX↵
- XXXXW.XXXX↵
- WXXXXXXXXX↵
- XXXXXXXXXX↵
- XXXXXXXXXW↵
- XXXXXXXXXW↵
- case 1: queen win:0 king win:0↵
- case 2: queen win:0 king win:0↵
- .RRX.XXX.X↵
- X....XX.R.↵
- ..X..X.WXX↵
- X........W↵
- XX.X.....X↵
- .X.RXX.WX.↵
- .X....X..X↵
- X.WXX.X..X↵
- XX.....X..↵
- XX..X.X.X.↵
- ↵
- RX.XXXXXX.↵
- XX.X.X...X↵
- XWXXWXRXX.↵
- XXXXX.XXX.↵
- XX.X.XXXX.↵
- .XXX..XXXX↵
- XXXXWXXRX.↵
- XWXXX.XXXX↵
- X.XXXX.XX.↵
- XXXRXX.X.X↵
- ↵
- XXXXXXXXXW↵
- XXX.RXRXXX↵
- XXXXXX.XX.↵
- XXX.X.XX.X↵
- .XX.XXXXXR↵
- XX..XXXXWX↵
- X.W.XXXXXX↵
- XX.XXXXX.X↵
- XX.XWRXXXX↵
- X.XXXXX.XX↵
- ↵
- XXWXXX....↵
- ..X.XX..X.↵
- X.RXXXXXX.↵
- X.XX.XX.XX↵
- XX.R..X..X↵
- WXX..R.XX.↵
- ...XXX..XX↵
- X.XW.X.XXX↵
- RX.X.WX...↵
- X.X..X.XX.↵
- ↵
- .XXXRXXX..↵
- .XX...XXXX↵
- X...XRXX..↵
- X.RX..XXXX↵
- .XX..XX.XW↵
- XRX.WXXXX.↵
- ..XXXXXX.X↵
- XX.XXX.W.X↵
- ....XXXXXW↵
- XX..XXXXX.↵
- ↵
- XX..XXXXXX↵
- XX.X.X.XXW↵
- XW.XXXXXX.↵
- XXWXRX..X.↵
- XXX..X...X↵
- RXX.X.W...↵
- XXXXXX..X.↵
- RXXX.XX.RX↵
- ...XXXXXXX↵
- .XX...X.X.↵
- ↵
- XX.X.XXXXR↵
- XXXXXXXX.X↵
- X.XX..XXXX↵
- XRXXR.WR..↵
- XX.X.XXXX.↵
- X.XXXX.X..↵
- XXXXXXXXX.↵
- X.WXXXXXXX↵
- XX.XXX..WX↵
- XXX.WXXXXX↵
- ↵
- X....XX..X↵
- ..WX..XXR.↵
- .XX...R...↵
- X.X.WW.X.X↵
- X.X.X.X...↵
- XXR.....XX↵
- .X..WXX.XX↵
- XX........↵
- ....XXX.X.↵
- RX......X.↵
- ↵
- .X..XXXXXX↵
- XXX.XXXXXX↵
- XXXXXX..XX↵
- W.RX.X.XXX↵
- case 1: queen win:-3 king win:4↵
- case 2: queen win:2 king win:2↵
- case 3: queen win:4 king win:4↵
- case 4: queen win:-2 king win:-2↵
- case 5: queen win:-13 king win:-14↵
- case 6: queen win:6 king win:4↵
- case 7: queen win:-7 king win:-7↵
- case 8: queen win:-4 king win:14↵
- case 9: queen win:-8 king win:-8↵
- case 10: queen win:-3 king win:-5↵
- case 11: queen win:2 king win:0↵
- case 12: queen win:-16 king win:-16↵
- case 13: queen win:10 king win:2↵
- case 14: queen win:-8 king win:-10↵
- case 15: queen win:7 king win:8↵
- case 16: queen win:-19 king win:-35↵
- case 17: queen win:-22 king win:-12↵
- case 18: queen win:1 king win:4↵
- case 19: queen win:-1 king win:-8↵
- case 20: queen win:2 king win:-8↵
- case 21: queen win:-8 king win:-13↵
- case 22: queen win:-2 king win:-1↵
- case 23: queen win:-2 king win:-6↵
- case 24: queen win:-3 king win:18↵
- case 25: queen win:10 king win:-13↵
- case 26: queen win:-4 king win:-4↵
- case 27: queen win:0 king win:-7↵
- case 28: queen win:1 king win:0↵
- case 29: queen win:16 king win:18↵
- case 30: queen win:6 king↵
题意:分别输出QueebMove和KingMove标记的估值(注:Queen走法是指移动的八个方向上只要没有跨越障碍(障碍包括棋子和箭)就可以移动;而King走法是指一次移动距离是1,也就是只能走步到相邻的空格)。
题解:因为是分别输出QueenMove和KingMove,故要分别进行两次BFS搜索。搜索起点从棋子开始,遇到边界、其他棋子和陷阱停止。刚开始写的是从空格开始搜到棋子等结束,但是QueenMove不好办,KingMove会超时。KingMove具体比较好操作,就是一个纯粹的BFS,没有什么特殊的地方;QueenMove需要注意一下,它一次可移动的八个方向步数均为1,在这里用"while(1)"操作,对着一个方向搜到底,遇到边界条件再弹出,但是这个会遇到有种情况,就是后来的会与之前搜过的产生冲突,即vis[][]已经被标记为1,不能再走,这样就会阻止对一个方向搜到底,对于这个情况,我们选择"continue"即之前搜过的我们就跳过就好了,也许还不明白这种情况具体是怎样,下面给出图示参考,黑色表示之前的一次搜索,红色表示之后的一次搜索,黄色表示产生冲突。
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;struct node1{int Write_MinStep;int Blake_MinStep;};node1 StrMap2_Q[11][11], StrMap2_K[11][11];char StrMap1[11][11];struct node2{int x, y;int step;};int vis1[11][11], vis2[11][11];int trend[8][2] = { {1,1},{-1,-1},{1,0},{-1,0},{0,1},{0,-1},{1,-1},{-1,1} };void K_BFS_W(node2 old){node2 st,next;queue<node2>W;W.push(old);while (!W.empty()){st = W.front();W.pop();for (int k = 0; k < 8; k++){next.x = st.x + trend[k][0];next.y = st.y + trend[k][1];next.step = st.step + 1;if (StrMap1[next.x][next.y] == '.'&&vis2[next.x][next.y] == 0 && next.x >= 0 && next.x < 10 && next.y >= 0 && next.y < 10){StrMap2_K[next.x][next.y].Write_MinStep = min(StrMap2_K[next.x][next.y].Write_MinStep,next.step);vis2[next.x][next.y] = 1;W.push(next);}}}}void K_BFS_B(node2 old){node2 st, next;queue<node2>B;B.push(old);while (!B.empty()){st = B.front();B.pop();for (int k = 0; k < 8; k++){next.x = st.x + trend[k][0];next.y = st.y + trend[k][1];next.step = st.step + 1;if (StrMap1[next.x][next.y] == '.'&&vis2[next.x][next.y] == 0 && next.x >= 0 && next.x < 10 && next.y >= 0 && next.y < 10){StrMap2_K[next.x][next.y].Blake_MinStep = min(StrMap2_K[next.x][next.y].Blake_MinStep, next.step);vis2[next.x][next.y] = 1;B.push(next);}}}}void Q_BFS_B(node2 old){node2 st, next;queue<node2>B;B.push(old);while (!B.empty()){st = B.front();B.pop();for (int k = 0; k < 8; k++){next.x = st.x; next.y = st.y;next.step = st.step + 1;while (1){next.x += trend[k][0];next.y += trend[k][1];if (vis1[next.x][next.y] == 1){continue;}if (StrMap1[next.x][next.y] == '.' && next.x >= 0 && next.x < 10 && next.y >= 0 && next.y < 10){StrMap2_Q[next.x][next.y].Blake_MinStep = min(StrMap2_Q[next.x][next.y].Blake_MinStep, next.step);vis1[next.x][next.y] = 1;B.push(next);}elsebreak;}}}}void Q_BFS_W(node2 old){node2 st, next;queue<node2>W;W.push(old);while (!W.empty()){st = W.front();W.pop();for (int k = 0; k < 8; k++){next.x = st.x; next.y = st.y;next.step = st.step + 1;while (1){next.x += trend[k][0];next.y += trend[k][1];if (vis1[next.x][next.y] == 1){continue;}if (StrMap1[next.x][next.y] == '.' && next.x >= 0 && next.x < 10 && next.y >= 0 && next.y < 10){StrMap2_Q[next.x][next.y].Write_MinStep = min(StrMap2_Q[next.x][next.y].Write_MinStep, next.step);vis1[next.x][next.y] = 1;W.push(next);}elsebreak;}}}}int QueenMove(){int Q_Write=0, Q_Blake=0;node2 st;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (StrMap1[i][j] == 'R'){memset(vis1, 0, sizeof(vis1));st.x = i; st.y = j; st.step = 0;vis1[i][j] = 1;Q_BFS_B(st);}if (StrMap1[i][j] == 'W'){memset(vis1, 0, sizeof(vis1));st.x = i; st.y = j; st.step = 0;vis1[i][j] = 1;Q_BFS_W(st);}}}for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (StrMap1[i][j] == '.'){if (StrMap2_Q[i][j].Write_MinStep > StrMap2_Q[i][j].Blake_MinStep)Q_Blake++;if (StrMap2_Q[i][j].Write_MinStep < StrMap2_Q[i][j].Blake_MinStep)Q_Write++;}}}return Q_Write - Q_Blake;}int KingMove(){int K_Write = 0, K_Blake = 0;node2 st;for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (StrMap1[i][j] == 'R'){memset(vis2, 0, sizeof(vis2));st.x = i; st.y = j; st.step = 0;vis2[i][j] = 1;K_BFS_B(st);}if (StrMap1[i][j] == 'W'){memset(vis2, 0, sizeof(vis2));st.x = i; st.y = j; st.step = 0;vis2[i][j] = 1;K_BFS_W(st);}}}for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (StrMap1[i][j] == '.'){if (StrMap2_K[i][j].Write_MinStep > StrMap2_K[i][j].Blake_MinStep)K_Blake++;if (StrMap2_K[i][j].Write_MinStep < StrMap2_K[i][j].Blake_MinStep)K_Write++;}}}return K_Write - K_Blake;}int main(){int count = 1;while (~scanf("%s", StrMap1[0])){for (int i = 1; i < 10; i++)scanf("%s", StrMap1[i]);for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){StrMap2_Q[i][j].Write_MinStep = 105;StrMap2_Q[i][j].Blake_MinStep = 105;StrMap2_K[i][j].Write_MinStep = 105;StrMap2_K[i][j].Blake_MinStep = 105;}}printf("case %d: queen win:%d king win:%d\n", count++, QueenMove(), KingMove());}return 0;}
阅读全文
0 0
- 博弈搜索练习-BFS-秋神也玩亚马逊
- 博弈搜索练习-BFS&DFS
- 两次BFS-简单搜索练习3
- 博弈搜索练习--POJ-2003 Hire and Fire
- POJ 3626 Mud Puddles 练习 BFS 宽度优先搜索
- 【搜索】BFS、DFS的综合练习(小鼠迷宫)
- poj2251--Dungeon Master(搜索练习3-三维bfs)
- 广度优先搜索练习之神奇的电梯----BFS
- 【日常练习 搜索】诡异的楼梯(队列+bfs)
- 搜索练习5/poj.org/problem2251/ Dungeon Master/bfs模板
- 搜索练习11/hdu/problem2612 Find a way/ bfs模板
- 搜索练习12/poj/problem3126 Prime Path/ bfs
- 搜索练习13/poj/problem1426 Find The Multiple/bfs
- 博弈搜索练习-极大极小值搜索+AlphaBeta剪枝--POJ 1085-Triangle War/三角点格棋
- UVALive 3695 (博弈 bfs)
- hdu 4101 bfs+博弈
- 搜索BFS
- 搜索 bfs
- Cortex-M0中断控制和系统控制
- OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
- codis离线迁移方案
- Prime Ring Problem
- 仿房产销冠APP销控表界面-多RecyclerView同步滚动
- 博弈搜索练习-BFS-秋神也玩亚马逊
- Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process.Proce
- 算法把rootview中所有的button改变背景
- Linux常用命令
- Oracle---Tip for SQL Database tuning and performance
- mysql获取各种时间段
- 分布式消息队列RocketMQ之Netty -- 1+N+M1+M2模型
- 《TP5.0学习笔记---请求和响应篇》
- IP地址异形