poj 3984 迷宫问题

题面:

定义一个二维数组:

int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

上代码 :

#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#include<string.h>
typedef long long ll;
const int maxn = 10005;
int a[] = { 1,-1,0,0 };
int b[] = { 0,0,-1,1 };
int maze[5][5];
int vis[5][5];


typedef struct
{
	int x, y;

}point;
point path[50];
int acount;

void bfs(int x,int y)
{
	queue<point>s;
	point t;
	t.x = x;
	t.y = y;
	s.push(t);
	vis[x][y] = 1;
	while (!s.empty())
	{
		point p = s.front();
		s.pop();
		if (p.x == 4 && p.y == 4)
		{
			acount += vis[p.x][p.y];
			return ;
		}
		for (int i = 0; i < 4; i++)
		{
			int xx = p.x + a[i];
			int yy = p.y + b[i];
			if (xx >= 0 && xx < 5 && yy >= 0 && yy < 5 && maze[xx][yy]!=1)
			{
				vis[xx][yy] = vis[p.x][p.y] + 1;
				point p1;
				p1.x = xx;
				p1.y = yy;
				s.push(p1);
				maze[xx][yy] = 1;
			}
		}
	}
}


int main()
{
	int i, j;
	for (i = 0; i < 5; i++)
		for (j = 0; j < 5; j++)
			cin >> maze[i][j];
	maze[0][0] = 1;
	bfs(0, 0);
	point p2;
	p2.x = 4, p2.y = 4;
	for (i = acount - 1; i >= 0; i--)
	{
		path[i].x = p2.x;
		path[i].y = p2.y;
		for (j = 0; j < 4; j++)
		{
			int xx = p2.x + a[j];
			int yy = p2.y + b[j];
			if (xx > 4 || xx < 0 || yy < 0 || yy>4)
				continue;
			if (vis[xx][yy] == vis[p2.x][p2.y] - 1)
			{
				p2.x = xx;
				p2.y = yy;
				break;
			}
		}
	}
	for (i = 0; i < acount; i++)
	{
		cout << '(' << path[i].x << ',' << path[i].y << ')' << endl;
	}


	



	return 0;
}

是求最短的路径的题,初看,用BFS 只能 求最小的步数啊,于是看了看大神的操作 ,原来BFS 也可以来求 路径。大开眼界。

下面说说思路 , 首先 先求出最短的步数 是多少 ,然后再从结束点往回退去搜 连成串的1,2,3,4,5,6...... 这个就是最短路径。

看看图:

 明显有个 1,2,3,4,5,6,7,8,9  只要找到 这个 线,就可以找到 路径了 。

代码怎么实现 :首先 要求的是 x,y 做标,肯定要 用到 结构体, 每次都在四个方向 都搜一下 ,看看 有没有连成一串的,如果是 ,那就进结构体数组,倒着装进数组中 。

p2.x = 4, p2.y = 4;
	for (i = acount - 1; i >= 0; i--)
	{
		path[i].x = p2.x;
		path[i].y = p2.y;
		for (j = 0; j < 4; j++)
		{
			int xx = p2.x + a[j];
			int yy = p2.y + b[j];
			if (xx > 4 || xx < 0 || yy < 0 || yy>4)
				continue;
			if (vis[xx][yy] == vis[p2.x][p2.y] - 1)
			{
				p2.x = xx;
				p2.y = yy;
				break;
			}
		}
	}

 最后再 正着输出路径 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值