深度搜索算法(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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基