迷宫问题--DFS

问题描述:

标题
迷宫问题  
时间限制
1 S 
内存限制
10000 Kb 

问题输入 
一组数据,输入数据第1行为两个正整数m和n,m表示迷宫高度,n表示迷宫宽度,m<100,n<100;第2行为两个整数,分表表示起点的行列位置;第3为两个整数,分别表示终点的行列位置;其后为m行数据,每行n个整数,表示迷宫对应位置的状态,0表示通路,1表示障碍。

问题输出 
以三元组形式输出从起点到终点搜索到的第一条通路,没有则输出no 

输入样例 
8 8
1 1
8 8
0 0 1 0 0 0 1 0
0 0 1 1 0 0 1 0 
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 1 0 0 0 0 0 0

输出样例 
(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),(4,1,2),(5,1,1),(5,2,1),(5,3,2),(6,3,1),(6,4,1),(6,5,2),(7,5,2),(8,5,1),(8,6,1),(8,7,1),(8,8,1) 

解题思路:
使用STL中的栈结构,并利用递归和DFS一步步搜索,四个方向不断探索。

源代码

#include<cstdio> 
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
struct base{
    int x,y,dir;
};
    int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};    //依据题意先后搜索的四个方向,右,下,左,上 
    stack<base> s;
    int m,n,a[1000][1000];  //在main函数外定义a[1000][1000]不然内存不够 
    int startx,starty,endx,endy;
    base now;
    int flag=0; //flag=1表示已经找到终点,不需要在搜索,剪枝想法 
void digui(){
    if(flag==1){
        return;
    }
    now=s.top();
    for(int i=0;i<4;i++){       //四个边界为特殊情况,要特殊处理 
        if(flag==1){
        return;
    }
        if(now.x==1&&i==3){
            s.pop();
            digui();
        }
        if(now.x==m&&i==1){
            continue;
        }
        if(now.y==1&&i==2){
            continue;
        }
        if(now.y==n&&i==0){
            continue;
        }
        if(a[now.x+d[i][0]-1][now.y+d[i][1]-1]==0){    //递归和DFS搜索 
            a[now.x+d[i][0]-1][now.y+d[i][1]-1]=1;
            now.x+=d[i][0];
            now.y+=d[i][1];
            now.dir=i+1;
            s.push(now);
            if(now.x==endx&&now.y==endy){
                flag=1;
                return;
                }
            else digui();

        }
        else if(i==3&&a[now.x+d[i][0]][now.y+d[i][1]]==1){
            s.pop();
            digui();

        }           
    }

}

int main(){
    cin>>m>>n;
    cin>>startx>>starty>>endx>>endy;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
    }
    now.x=startx;
    now.y=starty;
    now.dir=0;
    s.push(now);
    digui();

    base e[10000];
    int sum=0;
    if(s.empty()){
        cout<<"no"<<endl;   //没有搜到到,输出no 
        return 0;
    } 
    while(!s.empty()){  //栈存储的是逆序路径,转化为顺序路径 

        e[sum]=s.top();

        sum++;
        s.pop();        
    }
    for(int i=sum-1;i>=0;i--){
        if(i!=0)
        cout<<"("<<e[i].x<<","<<e[i].y<<","<<e[i-1].dir<<")"<<",";
        else
        cout<<"("<<e[i].x<<","<<e[i].y<<","<<e[i].dir<<")";
    }
    return 0;
}

转载请标明出处:请附上链接

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