DFS走迷宫(最短路径)

 朴素版(bf)

#include <bits/stdc++.h>
using namespace std;
int p,q,mmin=99999999,m,n;
int a[100][100];
int v[100][100];
void dfs(int x,int y,int step)
{
    if(x==p&&y==q)
    {
        if(step<mmin)
        {
            mmin=step;
        }
            return; 
    }
    if(a[x][y+1]==1&&v[x][y+1]==0)
    {
        v[x][y+1]=1;
        dfs(x,y+1,step+1);
        v[x][y+1]=0;
    }
    if(a[x+1][y]==1&&v[x+1][y]==0)
    {
        v[x+1][y]=1;
        dfs(x+1,y,step+1);
        v[x+1][y]=0;
    }
    if(a[x][y-1]==1&&v[x][y-1]==0)
    {
        v[x][y-1]=1;
        dfs(x,y-1,step+1);
        v[x][y-1]=0;
    }
    if(a[x-1][y]==1&&v[x-1][y]==0)
    {
        v[x-1][y]=1;
        dfs(x-1,y,step+1);
        v[x-1][y]=0;
    }
    return;
}
int main()
{
    int startx,starty;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d%d%d",&startx,&starty,&p,&q);
    v[startx][starty]=1;
    dfs(startx,starty,0);
    printf("%d",mmin);
    return 0;

}

优化后的代码

#include <bits/stdc++.h>
using namespace std;
int p,q,mmin=99999999,m,n;
int a[100][100];
int v[100][100];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y,int step)
{
    if(x==p&&y==q)
    {
        if(step<mmin)
        {
            mmin=step;
        }
            return;
    }
    for(int k=0;k<=3;k++)
    {
        int tx,ty;
        tx=x+dx[k];
        ty=y+dy[k];
        if(a[tx][ty]==1&&v[tx][ty]==0)
        {
            v[tx][ty]=1;
            dfs(tx,ty,step+1);
            v[tx][ty]=0;
        }
    }
    return;
}
int main()
{
    int startx,starty;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d%d%d",&startx,&starty,&p,&q);
    v[startx][starty]=1;
    dfs(startx,starty,0);
    printf("%d",mmin);
    return 0;

}


版权声明:本文为qq_62017916原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。