您的位置:首页 > 其它

博弈搜索练习-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秒64M0
测试用例 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秒64M0
题意:分别输出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);
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: