深搜01【P1238】走迷宫——迷宫问题的总结

迷宫问题是搜索题的常考题型。

搜索分为:BFS(广搜)和DFS(深搜),选用恰当的搜索方式是解题的重点。

(1)题目要求 打印出所有路径:适用于深搜(步步++  存储路径,调用自己)。

(2)题目要求 打印出最短路径:适用于广搜(标记前驱找最短路径)。

 

【P1238】走迷宫:就是要求打印出所有路径,显然是广搜。

 

//试题分析:本题是深搜基本题型
//用vis[][]存储一步步走过的路径; 用a[]和b[]存储路径位置(下标)
//不断的输出,不断的进行递归调用自己 

#include<iostream>
#include<cstdio>
using namespace std;
int u[5]={0,0,-1,0,1}; //扩展方向 
int w[5]={0,-1,0,1,0};
int n,m,i,j,desx,desy,soux,souy,x,y,a[200],b[200],map[51][51];
bool f,vis[51][51];

void dfs(int x,int y,int step) 
{
    if(x==desx&&y==desy)
    { //递归条件出口(到达终点) 
        for(int i=1;i<step;i++) //输出路径a,b中一步步存储的路径。 
            cout<<"("<<a[i]<<","<<b[i]<<")->";
        cout<<"("<<desx<<","<<desy<<")"<<endl;
        f=true;                 //bool 标记有路线 
        return;
    }
    vis[x][y]=true;
    a[step]=x;b[step]=y;
    for(int i=1;i<=4;i++)
    {  //扩展方向,扩展一步后再递归伸手 
        int tx=x+u[i],ty=y+w[i];
        if(tx>0&&ty>0&&tx<=n&&ty<=m&&map[tx][ty]&&!vis[tx][ty])
            dfs(tx,ty,step+1);
    }
    vis[x][y]=false;  //回溯 
}

 
int main()
{
    int i,j;
    cin>>n>>m;        //迷宫行列值 
    for(i=1;i<=n;i++) //迷宫二维表初始化 
        for(j=1;j<=m;j++)
        cin>>map[i][j];
    
    cin>>soux>>souy; //入口坐标 
    cin>>desx>>desy; //出口坐标
    f=false;
    dfs(soux,souy,1); // 从坐标的第一步开始 
    if(!f)cout<<-1<<endl;
     return 0;     
}

 

posted on 2018-11-27 09:49  lcdxjsj  阅读(895)  评论(0)    收藏  举报

导航