迷宫问题_DFS_打印路径(函数版)

我用的是大佬的代码  和《啊哈算法》的代码

有一点点修改,但思路一致

大佬博客链接:https://blog.csdn.net/riba2534/article/details/53507756

大概说下我对DFS目前的认知:

不同于BFS,BFS类似于水彩点染,墨水从起点那一点开始,以相同的速度向各个方向扩散,直到扩散到终点。

而DFS则是在每一个有不同走法的地方按自己规定的顺序对每种情况挨个进行尝试。

DFS在尝试的时候,对于每个岔口,当符合条件的时候进行下一步的操作,这个操作一致进行,直到

1.到达终点返回 

2.到了某一个点,无论怎么走,都没有符合往下走条件的

这两种情况都会让程序返回,即从这一种尝试中返回。

返回后,由于我们不止要走这一遍,所以刚才尝试时 为了防止走重复而将走过的点 全用book[ ][ ]标记为的1 也应该由于还要进行其他方式的尝试而抹去标记,重新置为0.

我觉得就是这种先按一种可行的方式尝试,按一条路走到黑,再返回,

同时 返回时注意 把刚才该点进行尝试 的 那种方式 到达的点 的 标记抹去。

但是此时返回时,只会是继续尝试,按照我们之前规定的顺序进行尝试,所以无需担心,(啊,我把之前那种尝试方式所到达的坐标点book为0了 会不会在这次尝试中又被重复尝试了一遍。显而易见不会的,因为我们的尝试  是有顺序的 ,比如说:我们在尝试完的a种操作后,返回这个点之后,按顺序只能对这个点进行b操作,假如说这个点进行b操作的尝试时,该尝试被判断是可以进行的,那么会再次进入一个新个函数,此时又重新从a操作开始按顺序进行判断,故而,此时 如果上次a操作 对应的点 的 标记已经被抹去了的话,那么此时这个(已经被抹去标记的点 就可以 在 因b操作合法 而进入到的 这个新函数中 被尝试了))

接下来贴代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<string>
#include<cmath>
#include<stack>


/*我的测试样例
5
0 0 0 0 0
1 1 0 0 1
1 1 0 0 1
1 1 0 0 1
0 0 0 0 0
1 1
5 5
*/

/*
3
0 0 0
1 1 0
1 1 0
1 1
1 1
*/
using namespace std;
int mapp[10][10];
int book[10][10];
int n;
int startx,starty;//起点的x和y
int gx,gy;//目标x,y
int mini=99999999;
int next[4][2]={ {0,-1},{0,1},{-1,0},{1,0} };
struct note
{
    int x,y;
};
stack<note> ss,temp;
note ans[2505];
void find_dfs(int x,int y,int cont)
{
    if(x==gx&&y==gy)
    {
        if(cont<mini)
        {
            mini=cont;
            ss=temp;
        }
        return;
    }
    for(int i=0;i<4;i++)
    {
        int tx=x+next[i][0];
        int ty=y+next[i][1];
        if(tx<1 || tx>n || ty<1 || ty>n)
            continue;
        if(mapp[tx][ty]==0&&book[tx][ty]==0)
        {
            note tt;
            tt.x=tx,tt.y=ty;
            book[tx][ty]=1;
            temp.push(tt);
            find_dfs(tx,ty,cont+1);
            book[tx][ty]=0;
            temp.pop();
        }
    }
    return;
}
int main()
{
    cin>>n;
    while(ss.size())
        ss.pop();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>mapp[i][j];
        }
    }
    cin>>startx>>starty;
    cin>>gx>>gy;
    memset(book,0,sizeof(book));
    book[startx][starty]=1;
    mini=9999999;
    find_dfs(startx,starty,0);
    cout<<mini<<endl;
    if(mini==9999999)
        cout<<"走不出迷宫"<<endl;
    else
    {
        cout<<"能走出迷宫,且最小步骤是: "<<mini<<endl;
        cout<<"最小步骤的路径为(若有多种步骤相同的最小路径,这里输出的仅是一种)"<<endl;
        for(int i=(int)ss.size()-1; i>=0; i--)
        {
            ans[i]=ss.top();
            ss.pop();
        }
        cout<<startx<<" "<<starty<<endl;
        for(int i=0;i<mini;i++)
            cout<<ans[i].x<<" "<<ans[i].y<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41764621/article/details/81771429