poj 3984迷宫问题(bfs加打印路径)

来源:互联网 发布:sql注入电子书 编辑:程序博客网 时间:2024/04/30 02:34
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)


解题思路:本题如果不写路径就是一道简单bfs题,打印路径本题是从后往前打,详情见代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int vis[10][10],Map[10][10];int head,tot;int dx[4] = {0,1,-1,0};int dy[4] = {1,0,0,-1};struct node{    int x;    int y;    int pre;}num[1100];void print(int n){    if(num[n].pre != -1){        print(num[n].pre);        printf("(%d, %d)\n",num[n].x,num[n].y);    }    return;}void bfs(){    //注意区分head和tot,前一个表示每一步,后一个表示有多少种尝试    tot = 0;    head = 0;    num[tot].x = 0,num[tot].y = 0,num[tot++].pre = -1;    while(head < tot)    {        for(int i=0;i<4;i++)        {            int m = num[head].x + dx[i];            int n = num[head].y + dy[i];            if(m >= 5 || n >= 5 || m < 0 || n < 0 || Map[m][n] == 1)                continue;            Map[m][n] = 1;            num[tot].x = m;            num[tot].y = n;            num[tot].pre = head;            tot++;            if(m == 4 && n==4)                print(head);        }        head++;    }}int main(){    for(int i=0;i<5;i++)    {        for(int j=0;j<5;j++)            scanf("%d",&Map[i][j]);    }    printf("(0, 0)\n");    bfs();    printf("(4, 4)\n");    return 0;}


0 0