poj3984迷宫问题

来源:互联网 发布:悠唐网络是真的吗 编辑:程序博客网 时间:2024/05/29 14:24

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 00 1 0 1 00 0 0 0 00 1 1 1 00 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<iostream>#include<queue>#include<cstdio>using namespace std;int go[4][2] = { { -1,0 },{ 1,0 },{ 0,1 },{ 0,-1 } };bool visit[35];int pre[35];int map[6][6];void print(int val){if (val < 25 && val >= 0 && pre[val] != -1){print(pre[val]);cout <<'('<< val / 5  << ", " << val % 5 <<')'<< endl;}elsecout <<'('<< 0 << ", " << 0<<')' << endl;}void BFS(){pre[0] = -1;visit[0] = true;queue<int> q;q.push(0);while (!q.empty()){int n = q.front();q.pop();int c = n % 5;int r = n / 5;for (int i = 0; i < 4; ++i){int nowc = c + go[i][0];int nowr = r + go[i][1];int tem = nowc + nowr * 5;if (nowc>=0&& nowc<5&& nowr >=0&&nowr<5 && !visit[tem]&& !map[r + go[i][1]][c + go[i][0]]){pre[nowc+nowr*5] = n;visit[nowc+nowr*5] = true;if (nowc+nowr*5 == 24){print(24);}q.push(tem);}}}}int main(){    for (int i = 0; i <5; i++)for (int j = 0; j < 5; j++){cin >> map[i][j];visit[i * 5 + j] = false;}BFS();//system("pause");}

广搜问题,每个地点只能到达一次,只有一个前驱,故可以根据正着广搜以表示所有点的前驱,再递归输出



0 0