首页 > 编程语言 >C++ 深度优先搜索(DFS) 讲解

C++ 深度优先搜索(DFS) 讲解

时间:2023-03-05 15:44:59浏览次数:51  
标签:int 讲解 迷宫 C++ flag DFS maze visited

目录

DFS初步概念

DFS是一种深度搜索算法,它的特点是"不撞南墙不回头",运用递归对不同方向的结果进行搜索。

DFS例题-迷宫游戏

题目描述

这是一个迷宫游戏,有一个n×n的矩阵,矩阵内只能有#.这两种字符,如果是#则是墙,如果是.则是可以走的路。起点是左上角,终点是右下角,每次只能往上、下、左、右四个方向走。
请你写一个程序,判断这个迷宫是否可以从起点走到终点。

输入输出格式

第1行一个整数n,代表矩阵大小为n×n。
第2~n+1行输入n×n的迷宫矩阵。
输出此迷宫是否能从起点走到终点,可以输出yes,不可以输出no

输入输出样例

输入#1

5
..##.
#..##
..###
.####
.....

输出#1

yes

输入#2

5
..###
...##
..##.
##...
.##..

输出#2

no

解题思路

char类型的二维数组maze存储输入的迷宫矩阵,用int类型的二维数组visited存储走过的地方,再用int类型的变量flag记录是否走完迷宫,flag初始值设为0,visited所有元素初始值设为0,mazevisited的下标是对应的,如果maze中的地方是#,则可以将visited相同下标元素的值设为1,再深度搜索可能的情况,若判断成功走到终点,则将flag设为1并结束递归。

代码

#include <bits/stdc++.h>

using namespace std;

char maze[105][105];
int visited[105][105],flag=0,n;
void dfs(int x,int y)//递归搜索函数
{
    if(x==n-1&&y==n-1)//走到终点的特判条件
    {
        flag = 1;
        return ;
    }
    else
    {
        if(!visited[x-1][y]&&x-1>=0)//上
        {
            visited[x-1][y] = 1;
            dfs(x-1,y);
        }
        if(!visited[x+1][y]&&x+1<=n-1)//下
        {
            visited[x+1][y] = 1;
            dfs(x+1,y);
        }
        if(!visited[x][y-1]&&y-1>=0)//左
        {
            visited[x][y-1] = 1;
            dfs(x,y-1);
        }
        if(!visited[x][y+1]&&y+1<=n-1)//右
        {
            visited[x][y+1] = 1;
            dfs(x,y+1);
        }
    }
}
int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin >> maze[i][j];
            if(maze[i][j]=='#')
            {
                visited[i][j] = 1;
            }
        }
    }
    if(visited[0][0]==1||visited[n-1][n-1]==1)
    {
        cout << "no" << endl;
        return 0;
    }
    dfs(0,0);
    if(flag==1) cout << "yes" << endl;
    else cout << "no" << endl;
    return 0;
}

标签:int,讲解,迷宫,C++,flag,DFS,maze,visited
From: https://www.cnblogs.com/TangYuHeng/p/Cpp_DeepFirstSearch_Preliminary.html

相关文章

  • 斯坦福课程 UE4 C++ ARPG游戏实例教程 01.基础AI与行树
    斯坦福课程UE4C++ARPG游戏实例教程0.绪论前言&摘要本篇文章是基于斯坦福UE4C++课程的学习记录。因为B站用户surkea由于学业原因,暂停了课程笔记的更新,这里狗尾续貂,将......
  • 斯坦福课程 UE4 C++ ARPG游戏实例教程 0.绪论
    斯坦福UE4C++课程学习笔记0.绪论前言UEC++在国内目前还处于比较新的一个领域,网上能找到的教程多为蓝图教程,且质量良莠不齐。终于在B站找到了外网搬运的斯坦福UEC++......
  • c++成员变量
    classss{public: inta; voidsolve(){ a=10; }};sst;ssp;t.solve();p.solve();对于类,上面是对类的一个声明,而下面是定义一个具体的对象,所以类中的int......
  • C++重载底层原理
    好吧,承认是自己浅薄了当被问起C++重载时,嘴角不自觉的微微上扬,然后脱口而出,C++重载的原则:函数名相同,函数参数列表不同(类型、个数、顺序)匹配原则1:严格匹配,找到再调用......
  • Adapter基础讲解
    这一节我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用Adapter很重要,Adapter是用来帮助填充数据的中间桥梁,简单来说就是:将各种数据以合适的形式显示到view上......
  • C++ 中的 bitset
    C++中的\(\textsf{bitset}\)是能够存储\(01\)的容器,这一点看似与布尔(bool)数组很像。而一个布尔类型将会占用\(1\)字节的空间,相对于\(\textsf{bitset}\)来讲\(1\)......
  • TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
    距离上次学Python写的Python实现简单聊天室已经过去好久了,现在学c++又写了一遍,其实过程差不多,无非是语法的变化,目前仅实现最简单的一对一的通信,然后改就是了,接下来应该是......
  • 最大前缀和C++
    //给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。#include<iostream>usingnamespacestd;constintN=2e5+10;//注意全局常量必须在前面添加c......
  • C/C++ 数据结构堆结构算法的实现
    #include<stdio.h>#include<stdlib.h>#include<string.h>//堆的算法实现#defineDEFAULT_CAPCITY128typedefstruct_Heap{int*arr;//存储堆元素的数组......
  • 河北工程806c/c++程序设计2013年-2021年编程题
    ps:都是自己练习写的,可能不是最好的写法,但是都运行过,能跑起来。2021年1.从键盘上输入一元二次方程(ax2+bx+c=0)的系数:a,b,c;计算并输出方程的根,如果没有实根则输出“No......