【POJ】3984 迷宫问题 BFS 与 DFS

问题

它表示一个迷宫,其中的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)

最短路径显然时DFS,关键在于输出路径,我们先记录最优解,在逆序用递归输出就ok,由于POJ数据太少(貌似只有一组数据)用DFS也过:

#include<stdio.h>
int map[5][5];
int a[]={0,0,1,-1},b[]={1,-1,0,0};//平移向量 
bool s(int x,int y)
{
    if(x==0&&y==0){
        return true;
    }
    for(int i=0;i<4;i++)
        if(0<=x+a[i]&&x+a[i]<5&&0<=y+b[i]&&y+b[i]<5&&!map[x+a[i]][y+b[i]])
        {
            map[x+a[i]][y+b[i]]=1;//记录已经来过的地方 防止重复
            if(s(x+a[i],y+b[i]))
            {
                printf("(%d, %d)\n",x+a[i],y+b[i]);
                return true;
            }
        }
    return false;
}
int main()
{
    for(int j=0;j<5;j++)
        for(int k=0;k<5;k++)
            scanf("%d",&map[j][k]);
    s(4,4);printf("(4, 4)\n");
    return 0;
}

应该用BFS的:

#include<stdio.h>
#include<queue>
using namespace std;
typedef pair<int,int> P;
int dp[5][5],map[5][5];int INF=10000,W=5,H=5;
int a[4]={0,0,1,-1},b[4]={1,-1,0,0};
void print(int x,int y)
{
    if(x==0&&y==0)
        return ;
    for(int i=0;i<4;i++)
        if((0<=x+a[i]&&x+a[i]<5&&0<=y+b[i]&&y+b[i]<5)&&(dp[x][y]-dp[x+a[i]][y+b[i]]==1))
        {
            print(x+a[i],y+b[i]);
            printf("(%d, %d)\n",x+a[i],y+b[i]);
            return ;
        }
}
int main()
{
    for(int j=0;j<5;j++)
        for(int k=0;k<5;k++)
            scanf("%d",&map[j][k]),dp[j][k]=-1;
    queue<P> q;P p;p.first=0,p.second=0;dp[0][0]=0;
    q.push(p);
    while(!q.empty())
    {
        for(int i=0;i<4;i++)
            if(0<=q.front().first+a[i]&&q.front().first+a[i]<H&&0<=q.front().second+b[i]&&q.front().second+b[i]<W&&!map[q.front().first+a[i]][q.front().second+b[i]]&&dp[q.front().first+a[i]][q.front().second+b[i]]<0)
            {
                dp[q.front().first+a[i]][q.front().second+b[i]]=dp[q.front().first][q.front().second]+1;
                p.first=q.front().first+a[i],p.second=q.front().second+b[i];
                q.push(p);
            } 
        q.pop();
    }
    print(4,4);//逆着输出 
    printf("(4, 4)\n"); 
    return 0;
}

比如输入
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
0 1 0 0 0
0 0 0 1 0

《【POJ】3984 迷宫问题 BFS 与 DFS》

我想说的是找最短距离问题用BFS,可行性问题用DFS

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/ctsas/article/details/53791159
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞