深度搜索算法(c++)

2024-06-01 04:04
文章标签 c++ 深度 搜索算法

本文主要是介绍深度搜索算法(c++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迷宫出口

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态, 0和1,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左 右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终 点有一个不能通行(为1),则看成无法办到。

输入

第1行是一个正整数n (1 ≤ n ≤ 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵, 矩阵中的元素为0或者1。再接下来一行是4个整数ha la hb lb,描述A处在第ha行 第la列,B处 在第hb行 第lb列。

输出

能办到则输出“YES”,否则输出“NO”。

输入复制

3

0 1 1

0 0 1

1 0 0

1 1 3 3

输出复制

YES

#include <iostream>
#include <iomanip>
using namespace std;
int a[110][110];
int n;
int si,sj,ei,ej;
bool f = false;
int di[] = {0,1,0,-1};
int dj[] = {1,0,-1,0};
void aaa(int,int);
int main()
{cin>>n;for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){cin>>a[i][j];}}cin>>si>>sj>>ei>>ej;si--;sj--;ei--;ej--;aaa(si,sj);if(f==true){cout<<"YES";}else{cout<<"NO";}return 0;
}
void aaa(int i,int j)
{if(i==ei&&j==ej){f = true;return;}a[i][j] = 2;for(int qqq = 0;qqq<4;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<n&&a[ti][tj]==0&&f==false){aaa(ti,tj);}}return;
}

数池塘

题目描述

农夫约翰的农场可以表示成N*M(1≤N≤100≤M≤100)个方格组成的矩形。由于 近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水('W') 或者没有积水('.')。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘 是一系列相连的有积水的方格,每一个方格周围的四个方格都被认为是与这个方格 相连的。现给出约翰农场的图样,要求输出农场上的池塘数。 

输入

第1行:由空格隔开的两个整数:N和M

第2..N+1行:每行M个字符代表约翰农场的一排方格的状态。每个字符或者是 'W'或者是'.',字符之间没有空格。

输出

输出只有1行,输出约翰农场上的池塘数

输入复制

10 12
W . . . . . . . . W W .
. W W W . . . . . W W W
. . . . W W . . . W W .
. . . . . . . . . W W .
. . . . . . . . . W . .
. . W . . . . . . W . .
. W . W . . . . . W W .
W . W . W . . . . . W .
. W . W . . . . . . W .
. . W . . . . . . . W .

输出复制

13

#include <iostream>
#include <iomanip>
using namespace std;
char a[110][110];
int n,m;
int cnt = 0;
int di[4] = {0,1,0,-1};
int dj[4] = {1,0,-1,0};
void aaa(int,int);
int main()
{cin>>n>>m;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){cin>>a[i][j];}}for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(a[i][j]=='W'){aaa(i,j);cnt++;}}}cout<<cnt;return 0;
}
void aaa(int i,int j)
{a[i][j] = '.';for(int qqq = 0;qqq<4;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]=='W'){aaa(ti,tj);}}return;
}

数池塘(八方向)

题目描述

农夫约翰的农场可以表示成 N×M(1≤N,M≤100)个方格组成的矩形。 由于近日的降雨,在约翰农场上的不同地方形成了池塘。 每一个方格或者有积水('W')或者没有积水('.')。农夫约翰打算数出 他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格, 每一个方格周围的八个方格都被认为是与这个方格相连的。 现给出约翰农场的图样,要求输出农场上的池塘数。

输入

第 11 行:由空格隔开的两个整数:NN 和 MM;

第 2..N+1 行:每行 M 个字符代表约翰农场的一排方格的 状态。每个字符或者是'W'或者是'.',字符之间没有空格

 输出

输出只有1行,输出约翰农场上的池塘数。

输入复制

10 12 

10 12
W . . . . . . . . W W .
. W W W . . . . . W W W
. . . . W W . . . W W .
. . . . . . . . . W W .
. . . . . . . . . W . .
. . W . . . . . . W . .
. W . W . . . . . W W .
W . W . W . . . . . W .
. W . W . . . . . . W .
. . W . . . . . . . W .

输出复制

3

#include <iostream>
#include <iomanip>
using namespace std;
char a[110][110];
int n,m;
int cnt = 0;
int di[] = {0,1,0,-1,1,-1,1,-1};
int dj[] = {1,0,-1,0,1,1,-1,-1};
void aaa(int,int);
int main()
{cin>>n>>m;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){cin>>a[i][j];}}for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(a[i][j]=='W'){aaa(i,j);cnt++;}}}cout<<cnt;return 0;
}
void aaa(int i,int j)
{a[i][j] = '.';for(int qqq = 0;qqq<8;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]=='W'){aaa(ti,tj);}}return;
}

奶牛和草丛

题目描述

奶牛Bessie计划好好享受柔软的春季新草。新草分布在 R 行 C列的牧场里。它想计算一下牧场中的草丛数量。

在牧场地图中,每个草丛要么是单个“#”,要么是有公共 边的相邻多个“#”。给定牧场地图,计算有多少个草丛。

例如,考虑如下5行6列的牧场地图;

. # . . . .

. . # . . .

. . # . . #

. . . . # #

. . . . . #

这个牧场有 3个草丛:一个在第一行,一个在第二列横跨 了二、三行,一个在第三行横跨了三、四、五行。

输入

第一行包含两个整数 R 和 C ,中间用 单个空格隔开。 接下来 R 行,每行 C 个字符,描述牧 场地图。字符只有“#”或“.”两种。 (1 ≤ R, C ≤ 100)

输出

输出一个整数,表示草丛数。

输入复制

5 6

. # . . . .

. . # . . .


. . # . . #

. . . . # #

. . . . . #

 输出复制

3

#include <iostream>
#include <iomanip>
using namespace std;
char a[110][110];
int n,m;
int cnt = 0;
int di[] = {0,1,0,-1};
int dj[] = {1,0,-1,0};
void aaa(int,int);
int main()
{cin>>n>>m;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){cin>>a[i][j];}}for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(a[i][j]=='#'){aaa(i,j);cnt++;}}}cout<<cnt;return 0;
}
void aaa(int i,int j)
{a[i][j] = '.';for(int qqq = 0;qqq<4;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<m&&a[ti][tj]=='#'){aaa(ti,tj);}}return;
}

晶 矿 的 个 数

题 目 描 述

在 某 个 区 域 发 现 了 一 些 晶 矿,已 经 探 明 这 些 晶 矿 总 共 有 分 为 两 类, 为红晶矿和黑晶矿。现在要统计该区域内红晶矿和黑晶矿的个数。

假设可以用二维地图m[][]来描述该区域,若m[i][j]为#表示该地点是 非晶矿地点,若m[i][j]为r表示该地点是红晶矿地点,若m[i][j]为b表 示该地点是黑晶矿地点。

一个晶矿是由相同类型的并且上下左右相通的晶矿点组成。现在给 你该区域的地图,求红晶矿和黑晶矿的个数。

输入格式

第一行为k,表示有k组测试输入。 每组第一行为n,表示该区域由 n*n个地点组成,

接下来n行,每行n个字符,表示该地点的类型。

输出格式

对每组测试数据输出一行,每行两个数字分别是红晶矿和黑晶矿的 个数,一个空格隔开。

样 例 输 入

 样 例 输 出

2 2

1 2

#include <iostream>
#include <iomanip>
using namespace std;
char a[110][110];
int n;
int nn;
int cnthong[110],cnthei[110];
int di[4] = {0,1,0,-1};
int dj[4] = {1,0,-1,0};
void aaa(int,int);
void aaaa(int,int);
int main()
{cin>>nn;for(int k = 0;k<nn;k++){cin>>n;for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){cin>>a[i][j];}}for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){if(a[i][j]=='r'){aaa(i,j);cnthong[k]++;}}}for(int i = 0;i<n;i++){for(int j = 0;j<n;j++){if(a[i][j]=='b'){aaaa(i,j);cnthei[k]++;}}}}for(int i = 0;i<nn;i++){cout<<cnthong[i]<<" "<<cnthei[i]<<endl;}return 0;
}
void aaa(int i,int j)
{a[i][j] = '.';for(int qqq = 0;qqq<4;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<n&&a[ti][tj]=='r'){aaa(ti,tj);}}return;
}
void aaaa(int i,int j)
{a[i][j] = '.';for(int qqq = 0;qqq<4;qqq++){int ti = i+di[qqq];int tj = j+dj[qqq];if(ti>=0&&ti<n&&tj>=0&&tj<n&&a[ti][tj]=='b'){aaa(ti,tj);}}return;
}

这篇关于深度搜索算法(c++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019934

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑