hdu2216 Game III--BFS(待解决)

原题链接: 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;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值