博弈搜索练习-BFS-秋神也玩亚马逊
2017-07-14 09:09
1186 查看
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
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示 ...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↵ | 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示 .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 c57a 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↵ | 1秒 | 64M | 0 |
题解:因为是分别输出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); } else break; } } } } 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); } else break; } } } } 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; }
相关文章推荐
- 博弈搜索练习-BFS&DFS
- 博弈搜索练习--POJ-2003 Hire and Fire
- POJ 3626 Mud Puddles 练习 BFS 宽度优先搜索
- 搜索练习2/fzu.edu.cn/problem2150 Fire Game (bfs)
- 【搜索】BFS、DFS的综合练习(小鼠迷宫)
- POJ 3626 Mud Puddles 练习 BFS 宽度优先搜索
- 搜索练习3 /poj.org/problem 3984 迷宫问题/bfs 回溯找路经
- 搜索练习5/poj.org/problem2251/ Dungeon Master/bfs模板
- 搜索练习13/poj/problem1426 Find The Multiple/bfs
- 搜索练习6/poj.org/problem3278 /Catch That Cow/简单的bfs模板
- poj2251--Dungeon Master(搜索练习3-三维bfs)
- 两次BFS-简单搜索练习3
- 博弈搜索练习-极大极小值搜索+AlphaBeta剪枝--POJ 1085-Triangle War/三角点格棋
- 搜索练习9 https://cn.vjudge.net/contest/81658#problem/J Fire! bfs
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
- sdut 3468 广度优先搜索练习之神奇的电梯(BFS)
- [SDUT](3468)广度优先搜索练习之神奇的电梯 ---BFS(图)
- SDUT-3468 广度优先搜索练习之神奇的电梯(BFS)
- 【日常练习 搜索】诡异的楼梯(队列+bfs)
- 广度优先搜索练习之神奇的电梯----BFS