【原创】

今天来说说深度优先搜索,深度优先是图论中的内容,大意是从某一点出发,沿着一个方向搜索下去,并伴随着有回退的特点,通常用来判断某一解是否存在,不用来寻找最优解;这里来看一个非常有意思的题目;

题目描述:一只小狗在迷宫中,假设在迷宫用字符表示,如图所示:

S.X.
..X.
...D 这其中,S表示起点,是需要程序寻找出来的,这里比较特殊,在最左上角,“.”表示可走的格子,D表示出口,X表示强,不能走,每一秒小狗必须移动一个距离,即前后左右,那么输入时间t,小狗能否刚好在t秒的时间上到达D,看清楚是刚好在t秒上,不是至少在t秒内,所以程序中的判断应该注意这一点,
思想:利用深度优先搜索,将每一个点的状态抽象出来,一个三元组(x,y,t);x,y代表坐标,t表示从起点到这一坐标的时间,那么这就是一个状态,深度搜索的任务就是对状态的扩展,观察并判断是否到达目标状态;见如下代码,注释地方都有,同时支持多组测试数据;
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
//深度优先搜索
//小狗逃离迷宫问题
char maze[][];//输入的迷宫规模1 < n < 7
int nd,md,t;//nd和md表示是矩阵迷宫的规模,t为时间,nd表示x方向,md表示y方向
bool success;//标记
int go[][] = {,,-,,,,,-};//一个点可以扩展的上下左右四个状态
void DFS(int x,int y,int time){
    for (int i = ; i<; i++) {//对这个点进行四个方向的扩展
        int nx = x+go[i][];
        int ny = y+go[i][];
        if (nx<||nx>nd||ny<||ny>md) continue;//表示跳出了迷宫
        if(maze[nx][ny]=='X')continue;//该位置为墙
        if(maze[nx][ny]=='D'){//找到了出口,
            if(time+==t){//由于题目要求的是t时间刚好到达出口,所以这里不能用<t作为判断;
                success = true;
                return;
            }
            else
                continue;//继续,并且该状态的后继状态不可能为答案,
        }
        maze[nx][ny] = 'X';//说明这个状态能够扩展,之所以将其修改为墙,是因为防止后继状态又扩展回这个状态
        DFS(nx, ny, time+);// 继续从该状态扩展
        maze[nx][ny] = '.';//返回后要将其修改回原来的状态
        if(success)return;//说明找到了目标状态且满足题意,可以返回;
    }
}
void test_3(){
    while (scanf("%d%d%d",&nd,&md,&t)!=EOF) {
        if (nd==&&md==&&t==) break;
        for (int i = ; i<=nd;i++) {
            scanf("%s",maze[i]+);//输入字符迷宫,必须+1,这才是从[1][1]开始的
        }
        success = false;
        for (int i = ;i<=nd;i++) {//寻找开始坐标
            for (int j = ; j<=md; j++) {
                if(maze[i][j]=='S'){
                    maze[i][j] = 'X';//将起点标记为墙
                    DFS(i,j,);//开始扩展;
                    break;
                }
            }
        }
        puts(success==true?"YES":"NO");
         
    }
}
int main() {
//    test_1();
//    test_2();
    test_3();
    return ;
}
 
/**************************************************************
    Problem: 1461
    User: Numen_fan
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1020 kb
****************************************************************/

注:迷宫输入一定是从maze[1][1],开始的,因此34行处scanf("%s",maze[i]+1);还有就是24-16行代码处应该好好理解一下,注释有提出

 

深度优先搜索(DFS),逃离迷宫的更多相关文章

  1. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. 【算法入门】深度优先搜索(DFS)

    深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...

  5. 深度优先搜索 DFS 学习笔记

    深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...

  6. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  7. 算法总结—深度优先搜索DFS

    深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake C ...

  8. HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告

    前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...

  9. [LeetCode OJ] Word Search 深度优先搜索DFS

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  10. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

随机推荐

  1. Linux修改时区以及同步时间

    Centos7为例:修改时区 timedatectl list-timezones |grep Shanghai #查找中国时区的完整名称 Asia/Shanghai timedatectl set- ...

  2. Hibernate知识点小结(四)--JPA

    一.jpa的简介和入门 JPA:Java Persistence API,接口规范    Hinernate内部为JPA规范提供实现        开发步骤(EntityManager):       ...

  3. Webpack Tapable原理详解

    directory - src - sim ---- 简单的模拟实现 - /.js$/ ---- 使用 代码已上传github, 地址 Detailed Webpack 就像一条生产线, 要经过一系列 ...

  4. #leetcode刷题之路9- 回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1:输入: 121输出: true 示例 2:输入: -121输出: false解释: 从左向右读, 为 ...

  5. 最长递增子序列(51Nod - 1134)

    20180604 23:18 https://blog.csdn.net/joylnwang/article/details/6766317(写得很用心,膜拜dalao) 给出长度为N的数组,找出这个 ...

  6. phpstudy启动时Apache启动不了

    打开cmd,输入:D:\phpStudy\PHPTutorial\Apache\bin\httpd.exe -t 回车,即显示错误信息 说是我们的有一个文件目录不存在或者不可读取, 出现这个一般有两种 ...

  7. PHP入门笔记--基础语法一

    一.基本语法 php标记 <?php ?> php代码结束标记 三种注释 // /**/ # 二.类型 四种标量类型:boolean, integer, float, string 三种复 ...

  8. ruby mysql2

    1. mysql2连接选项 Mysql2::Client.new( :host, :username, :password, :port, :database, :socket = '/path/to ...

  9. Jupyter Notebook里面使用Matplotlib画图 图表中文乱码问题

    可查看以下链接: https://blog.csdn.net/ccblogger/article/details/79613335

  10. Python3 使用基本循环实现多级目录(思路)

    一.多级目录设计: 1. 通过循环的方式显示菜单和进入菜单 2. 设置标志位以提供回退上一层菜单 2. 设置标志位以提供退出程序 二.注意要点: 1. 菜单样式,层次关系不要弄混乱 2. 当输入错误时 ...