zoukankan      html  css  js  c++  java
  • 深度优先搜索(深搜)——Deep First Search【例题:迷宫】

           深度优先搜索

      基本思想:先选择一种可能情况向前探索,在探索过程中,一点那发现原来的选择是错误的,就退回一步重新选择,继续向前探索,(回溯)反复进行。

    【例题】迷宫问题                      ——【传送门】

    思路:先随意选择一个方向,一步步向前试探,如果碰到死胡同说明该前进方向已经无路可走,这时首先看别的方向还是否有路可走,若有路可走,则该方向再次向前试探,若没有,则退回上一步,再看其他方向是否有路可走,,按此原则不断回溯和探索,知道找到入口为止。

    框架:

    int search(int ......)
    {
        for(i=1;i<=方向总数;i++)
        if(满足条件)
        {
            保存结果;
            if(到达目的地)
                输出解;
            else search(k+1);
            恢复:保存结果之前的状态{回溯一步}; 
        }
    }

    具体代码实现如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 20
    using namespace std;
    int map[MAXN][MAXN];//表示迷宫地图 
    bool temp[MAXN][MAXN];//标记是否走过 
    int dx[4]={0,0,1,-1};//横坐标的上下左右 
    int dy[4]={-1,1,0,0};//纵坐标的上下左右 
    int m,n,total,sx,sy,fx,fy,l,r,t;//m,n:地图的长宽,total:方案总数,sx,sy起点的横纵坐标,fx,fy:终点的横纵坐标,t:障碍总数,l,r:障碍坐标 
    void search(int x,int y)//x,y:现在所在的点的坐标 
    {
        if(x==fx&&y==fy)//到达终点
        {
            total++;//方案总数 
            return;    //返回继续寻找 
        }
        for(int i=0;i<=3;i++)
            if(temp[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1)//判断下面要走的路是否有障碍 
            if(x+dx[i]>=1&&y+dy[i]>=1&&x+dx[i]<=n&&y+dy[i]<=m)//判断是否超越迷宫边界 
            {
                temp[x+dx[i]][y+dy[i]]=1;
                search(x+dx[i],y+dy[i]);
                temp[x+dx[i]][y+dy[i]]=0;//回溯一步 
            }
    }
    int main()
    {
        cin>>n>>m>>t;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        map[i][j]=1;
        cin>>sx>>sy;
        cin>>fx>>fy;
        for(int i=1;i<=t;i++)
        {
            cin>>l>>r;
            map[l][r]=0;
        }
        map[sx][sy]=0;
        search(sx,sy);
        printf("%d",total);
        return 0;
    }
  • 相关阅读:
    我爬了《流浪地球》十万个短评得出以下结论
    Activiti开发案例之代码生成工作流图片
    Activiti开发案例之activiti-app工作流导出图片
    用MySQL语法建 一个学生表,包括学生姓名、性别、年龄、班级信息。
    事务是什么,以及事务四个特性
    精选30道Java笔试题解答
    父类和子类的构造方法的调用顺序
    Java的修饰符
    volatile修饰符
    Java中普通代码块,构造代码块,静态代码块区别及代码示例
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/8505506.html
Copyright © 2011-2022 走看看