POJ3984 迷宫问题

题目链接:POJ3984 迷宫问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 48864 Accepted: 26518

Description
定义一个二维数组:
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)

程序说明:

最小路径问题可以用广度优先搜索,注意方向向量的取值。
用path数组记录每一个位置的前驱,打印坐标需要建立一个数组p用于保存路径(从终点开始找每一个位置前驱直到起点),最后循环输出数组p存储的坐标即可。

代码如下:

#include <iostream>
#include <queue>
#define MAX 5
#define INF 100000
using namespace std;
//存图 
int maze[MAX][MAX];
//记录到各个位置的最短路径 
int d[MAX][MAX];
//4个方向移动的向量 
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
//定义坐标结构体类型 
struct point {
	int x;
	int y;
};
//记录每一个位置的前一个位置的坐标 
point path[5][5]; 
//打印坐标 
void print(point p1) {
	//定义数组存坐标 
	point p[25];
	int cnt = 0;
	for(;;) {
		p[cnt] = p1;
		if(d[p1.x][p1.y] == 0)
			break;
		p1 = path[p1.x][p1.y];
		cnt++;
	}
	while(cnt >= 0) {
		cout<<"("<<p[cnt].x<<", "<<p[cnt].y<<")"<<endl;
		cnt--;
	}
}
void bfs() {
	queue<point> q;
	//初始化图 
	for(int i = 0; i < 5; i++)
		for(int j = 0; j < 5; j++)
			d[i][j] = INF;
	//起点坐标 
	point p;
	p.x = 0, p.y = 0;
	q.push(p);
	d[p.x][p.x] = 0;
	//队不空 
	while(!q.empty()) {
		//从队头取出元素 
		point p1 = q.front();
		q.pop();		
		//如果从队列取出的状态已经是终点则结束搜索且打印 
		if(p1.x == 4 && p1.y == 4) {
			print(p1);
			break;
		}
		//四个方向的循环 
		for(int i = 0; i < 4; i++) {
			point p2;
			p2.x = p1.x + dx[i];
			p2.y = p1.y + dy[i];
			//判断移动后的位置是否可以访问
			if(p2.x >= 0 && p2.y >= 0 && p2.x < 5 && p2.y < 5 &&
					d[p2.x][p2.y] == INF && maze[p2.x][p2.y] != 1) {
				q.push(p2);
				d[p2.x][p2.y] = d[p1.x][p1.y] + 1;	
				path[p2.x][p2.y] = p1;
			}
		}
	}
	//返回最短路径 
	//return d[4][4];
}
int main() {
	for(int i = 0; i < 5; i++)
		for(int j = 0; j < 5; j++)
			cin>>maze[i][j];
	bfs();
	return 0;	
}
发布了32 篇原创文章 · 获赞 0 · 访问量 388
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览