POJ 3984 - 迷宫问题

题目大意:中文题。。。定义一个二维数组: 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

解题思路:建立一个模拟队列的结构体,其中包括x,y,pre。pre用于存储前一步的位置(结构体数组的位)。全局变量,标记数组,头尾位置。bfs先将起点读入,pre为-1。然后循环将起点上下左右判断是否能移动,能移动存入结构体,pre为这一次读入的位置的的数组位置(未出列时的头)。当移动后的位置为终点时退出。输出时dfs,如果pre未=-1,表示没到起点,进入下一层,直到到起点,输出,回上一层输出。

ac代码:

#include <iostream>
using namespace std;
struct node{
	int x;
	int y;
	int pre;
}no[50];
int dx[4]={-1, 1, 0, 0}, dy[4]={0, 0, -1, 1};
int front, rear, a[5][5], vis[5][5];
void bfs() {
	int temp1, temp2, X, Y;
	front = rear = 0;
	for (int i=0; i<5; i++)
		for (int j=0; j<5; j++){
			vis[i][j] = 0;
			if (a[i][j])
				vis[i][j] = 1;
		}
	no[0].x = no[0].y = 0;
	no[0].pre = -1;
	rear++;
	while (front < rear){
		temp1 = no[front].x, temp2 = no[front].y;
		if (temp1 == 4 && temp2 == 4)
			return ;
		front++;
		for (int i=0; i<4; i++){
			X = temp1 + dx[i];
			Y = temp2 + dy[i];
			if (X >= 0 && X < 5 && Y >= 0 && Y < 5 && !vis[X][Y]){
				no[front].x = X, no[front].y = Y, no[front].pre = front-1;
				vis[X][Y] = 1;
				rear++;
			}	
		}	
	}		
}
void prin(node n) {
	if (n.pre == -1)
		printf("(%d, %d)\n", n.x, n.y);
	else{
		prin(no[n.pre]);
		printf("(%d, %d)\n", n.x, n.y);
	}			
}
int main() {
	while (scanf("%d", &a[0][0])!=EOF){
		for (int i=0; i<5; i++)
			for (int j=0; j<5; j++)
				if (i || j)
					scanf("%d", &a[i][j]);
		bfs();
		prin(no[front]);
	}
return 0;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/qq_38638213/article/details/77824272
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞