原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2216
一:题意
一个n*m的矩阵迷宫,Z找到S点,但是Z每走一步,S也要往相反方向走一步(如果有地方可以走的话),直到两点相遇或相邻,求Z的最小移动步。
二:分析
设置四维数组标记Z与S的相对位置。
三:AC代码
代码是没有AC的,但是一直没有找出错误,以后来解决吧。
参考自:http://www.cnblogs.com/cchun/archive/2011/11/30/2520195.html
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int dir[4][2] = { { -1,0 },{ 0,1 },{ 1,0 },{ 0,-1 } };
bool vis[25][25][25][25];
char ch[25][25];
int sx, sy;
int dx, dy;
int n, m;
struct Node
{
int x, y;
int step;
};
bool check(Node & s, Node & d)
{
if (s.x == d.x&&s.y == d.y)//重合
return 1;
for (int i = 0; i < 4; i++)//相邻
if (s.x + dir[i][0] == d.x&&s.y + dir[i][1] == d.y)
return 1;
return 0;
}
int bfs()
{
Node snode1, snode2;//Zjt
Node dnode1, dnode2;//Sara
queue<Node> Q;
snode1.x = sx;
snode1.y = sy;
snode1.step = 0;
dnode1.x = dx;
dnode1.y = dy;
dnode1.step = 0;
vis[sx][sy][dx][dy] = 1;
Q.push(snode1);
Q.push(dnode1);
while (!Q.empty())
{
snode1 = Q.front();
Q.pop();
dnode1 = Q.front();
Q.pop();
if (check(snode1, dnode1))
return snode1.step;
for (int i = 0; i < 4; i++)
{
snode2 = snode1;
dnode2 = dnode1;
snode2.x += dir[i][0];
snode2.y += dir[i][1];
dnode2.x -= dir[i][0];//相反方向
dnode2.y -= dir[i][1];
//Sara走不了,留在原地,还有要注意的是先判断是否出界再判断该位置,否则可能会运行错误
if (dnode2.x < 0 || dnode2.x >= n || dnode2.y < 0 || dnode2.y >= m || ch[dnode2.x][dnode2.y] == 'X')
dnode2 = dnode1;
if (snode2.x >= 0 && snode2.x < n && snode2.y >= 0 && snode2.y < m&&vis[snode2.x][snode2.y][dnode2.x][dnode2.y] == 0 && ch[snode2.x][snode2.y] == '.')
{
snode2.step++;
vis[snode2.x][snode2.y][dnode2.x][dnode2.y] = 1;
Q.push(snode2);
Q.push(dnode2);
}
}
}
return -1;
}
int main()
{
while (~scanf("%d%d", &n, &m))
{
for (int i = 0; i < n; i++)
{
getchar();
for (int j = 0; j < m; j++)
{
scanf("%c", &ch[i][j]);
if (ch[i][j] == 'Z')
{
sx = i;
sy = j;
ch[i][j] = '.';//注意这里
}
else if (ch[i][j] == 'S')
{
dx = i;
dy = j;
ch[i][j] = '.';//注意这里
}
}
}
memset(vis, 0, sizeof(vis));
int ans = bfs();
if (ans == -1)
printf("Bad Luck!\n");
else
printf("%d\n", ans);
}
return 0;
}