您的位置:首页 > 其它

POJ 3984 - 迷宫问题

2017-09-03 18:11 323 查看
题目大意:中文题。。。定义一个二维数组: 它表示一个迷宫,其中的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: