搜索测试题题解(3月19号总结)

目录

1.Dungeon Master

2.Oil Deposits

3.Find a way


1.Dungeon Master

Sample

InputcopyOutputcopy
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0
Escaped in 11 minute(s).
Trapped!

这道题与普通的bfs模板题就是地图变成三维的了,其余一律按照模板做法来即可。

下面是AC代码:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int h,n,m;
char mp[35][35][35];
struct point{//结构体定义 
	int z,x,y,step;
};
int v[35][35][35];//是否遍历判断数组 
int dx[]={1,-1,0,0,0,0};//枚举6个操作 
int dy[]={0,0,1,-1,0,0};
int dz[]={0,0,0,0,1,-1};
int main()
{
	while(cin>>h>>n>>m){
		if(h==0&&n==0&&m==0) break;//运行结束标志 
		int ex,ey,ez,sx,sy,sz;
		for(int i=1;i<=h;i++){
			for(int j=1;j<=n;j++){
				for(int k=1;k<=m;k++){
					cin>>mp[i][j][k];
					if(mp[i][j][k]=='S')
					{
						sz=i,sx=j,sy=k;//找到起点位置 
					}
					if(mp[i][j][k]=='E')
					{
						ez=i,ex=j,ey=k;//找到终点位置 
					}	
				}
			}
		}
		queue<point>q;
		point st;
		st.x=sx,st.y=sy,st.z=sz,st.step=0;
		v[sz][sx][sy]=1;
		q.push(st);
		int f=0;
		while(!q.empty()){
			point k=q.front();
			q.pop();
			if(k.x==ex&&k.y==ey&&k.z==ez)//到达位置 
			{
				f=1;
				cout<<"Escaped in "<<k.step<<" minute(s).\n";//按照格式输出 
				break;
			}
			for(int i=0;i<6;i++){
				int tx=k.x+dx[i];
				int ty=k.y+dy[i];
				int tz=k.z+dz[i];
				if(tx<1||ty<1||tz<1||tz>h||tx>n||ty>m||mp[tz][tx][ty]=='#'||v[tz][tx][ty]) continue;//错误位置判断 
				v[tz][tx][ty]=1;
				point p;
				p.x=tx,p.y=ty,p.z=tz,p.step=k.step+1;
				q.push(p);//赋值入队 
			}
		}
		if(f==0)
		{
			cout<<"Trapped!\n";//走不出 
		}
		memset(v,0,sizeof(v));//初始化,防止对下一次数据造成影响 
	}
	return 0;
}

2.Oil Deposits

Sample

InputcopyOutputcopy
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 
0
1
2
2

该题需要我们找出有多少种类的油,当两油的相对位置如下

则这两油为同一种类的油,可以用dfs对一油袋周围深搜,搜到的油改为平底,这用每搜一次,对应的不同种类油就可以+1。

下面是AC代码:

#include<cstdio> 
#include<iostream> 
using namespace std;
char mp[120][120];
int n,m,ans;
int dx[8]={-1,-1,0,1,1,1,0,-1};//操作方向 
int dy[8]={0,1,1,1,0,-1,-1,-1}; 
void dfs(int x,int y)   
{
	if(x<0||y<0||x>=n||y>=m) return;//越界停止搜 
	if(mp[x][y]=='@')
	{
		mp[x][y]='*';
		for(int i=0;i<8;i++){
			dfs(x+dx[i],y+dy[i]);//继续搜 
		}
	}
	return;
}              
int main()
{
	while(cin>>n>>m){
		if(n==0&&m==0) break;
		ans=0;//初始化 
		for(int i=0;i<n;i++)
		cin>>mp[i];
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(mp[i][j]=='@')//发现不同种类油袋 
				ans++,dfs(i,j);//将与它连通的油袋变为'*' 
			}
		} 
		cout<<ans<<"\n";
	}
	return 0;
}

3.Find a way

Sample

InputcopyOutputcopy
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
66
88
66

这道题要求我们找到一个Y和M去到一家肯德基汇合的最短时间和,我们可以分别给Y和M定义一个距离数组,为Y和M到相应位置的距离,后面对肯德基的位置比较,找到一个最短距离和。

下面是AC代码:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
char mp[201][201];
int v[201][201];
int dis1[201][201],dis2[201][201];//定义两个距离数组 
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct node{
	int x,y;
};
int bfs(int x,int y,int n,int m,char f)
{
	queue<node>q;
	node st;
	int ans=0;
	st.x=x,st.y=y;
	v[x][y]=1;
	q.push(st);
	while(!q.empty()){
		node k=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int tx=k.x+dx[i];
			int ty=k.y+dy[i];
			if(!v[tx][ty]&&mp[tx][ty]!='#'&&tx>=1&&ty>=1&&tx<=n&&ty<=m)
			{
				v[tx][ty]=1;
				node p;
				if(f=='Y') dis1[tx][ty]=dis1[k.x][k.y]+1;//按照f,给相应的距离数组赋值 
				else dis2[tx][ty]=dis2[k.x][k.y]+1;
				p.x=tx,p.y=ty;;
				q.push(p);
			}
		}
	}
	return ans*11;
}
int main()
{
	int n,m;
	while(cin>>n>>m){
		node kfc[40100];
		int z=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>mp[i][j];
				if(mp[i][j]=='@') kfc[++z].x=i,kfc[z].y=j;//找到每家kcf的位置 
			}
		}
		for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					if(mp[i][j]=='Y') 
					{
						bfs(i,j,n,m,'Y');
						memset(v,0,sizeof(v));//初始化 
					}
					if(mp[i][j]=='M')
					{
						bfs(i,j,n,m,'M');
						memset(v,0,sizeof(v));
					} 
				}
			}
			int ans=1e8;
			for(int i=1;i<=z;i++){
				if(dis1[kfc[i].x][kfc[i].y]!=0&&dis2[kfc[i].x][kfc[i].y]!=0)
				ans=min(ans,dis1[kfc[i].x][kfc[i].y]+dis2[kfc[i].x][kfc[i].y]);//更新最短距离 
			}
			cout<<ans*11<<"\n";
			memset(dis1,0,sizeof(dis1));//初始化 
			memset(dis2,0,sizeof(dis2));
	} 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建强大的API:Django中的REST框架探究与实践【第146篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 构建强大的API&#xff1a;Django中的REST框架探究与实践 在当今的Web开发中&#xff0c;构…

微服务cloud--抱团取暖吗 netflix很多停更了

抱团只会卷&#xff0c;卷卷也挺好的 DDD 高内聚 低耦合 服务间不要有业务交叉 通过接口调用 分解技术实现的复杂性&#xff0c;围绕业务概念构建领域模型&#xff1b;边界划分 业务中台&#xff1a; 数据中台&#xff1a; 技术中台&#xff1a; 核心组件 eureka&#x…

【C语言】动态内存管理及其常见错误

文章目录 1、前言&#xff1a;为什么要有动态内存分布2、三种动态内存的创建方式及其释放2.1 malloc2.2 calloc2.3 ralloc2.4 free 3、常⻅的动态内存的错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使⽤free释放⼀块动态开…

Linux网络协议栈从应用层到内核层②

文章目录 1、bind 源码剖析2、listen 源码剖析3、accept 源码剖析4、connect 源码剖析客户端调用connect成功&#xff0c;但三次握手并未完成&#xff0c;进程是如何阻塞自己客户端在connect时&#xff0c;如何选择源端口客户发送syn封包以及重传服务端收到syn封包&#xff0c;…

echarts 折线图 数据点过密,显示重叠该如何解决

echarts 折线图 数据点过密&#xff0c;显示重叠该如何解决 有这样一个图表&#xff0c;显示的数据比较多&#xff0c; 当把 label 显示出来的时候&#xff0c;这些 label 重叠了&#xff0c;我想让它间隔一下。 结果是这样的&#xff1a; 只需要在 label.formatter 上处理 …

Linux课程____Samba文件共享服务

一、 Samba服务基础 SMB协议&#xff0c;服务消息块 CIFS协议&#xff0c;通用互联网文件系统 1.Samba 服务器的主要程序 smbd:提供对服务器中文件、打印资源的共享访问 nmbd:提供基于 NetBlOS 主机名称的解析 2.目录文件 /etc/samba/smb.conf 检查工具&#xff1a;test…

408学习笔记-17-C-C/C++中程序内存区域划分

C/C中程序内存区域划分 C/C程序内存分配的几个区域&#xff1a; 1、栈区(stack)&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高…

前端学习笔记 | Node.js

一、Node.js入门 1、什么是Node.js 定义&#xff1a;是跨平台JS运行环境&#xff08;可以独立执行JS的环境&#xff09;作用&#xff1a; 编写数据接口&#xff0c;提供网页资源功能等等前端工程化&#xff1a;为后续学Vue和React等框架做铺垫 2、Node.js为何能执行JS&#xff…

【Java反序列化】CommonsCollections-CC1链分析

前言 好几天没发博文了&#xff0c;偷偷憋了个大的——CC1链分析&#xff0c;手撸了一遍代码。虽然说&#xff0c;这个链很老了&#xff0c;但还是花费了我一段时间去消化吸收&#xff0c;那么接下来&#xff0c;我会简洁的介绍下整个链的利用过程&#xff0c;还有哪些不理解的…

2核4G服务器阿里云性能测评和优惠价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

HTTP --- 上

目录 1. HTTP协议 2. 认识URL 2.1. URL中的四个主要字段 2.2. URL Encode && URL Decode 3. HTTP 协议格式 3.1. 快速构建 HTTP 请求和响应的报文格式 3.1.1. HTTP 请求格式 3.1.2. HTTP 响应格式 3.1.3. 关于 HTTP 请求 && 响应的宏观理解 3.2. 实现…

SpringBoot+Vue项目(后端项目搭建 + 添加家居)

文章目录 1.使用版本控制管理该项目1.创建远程仓库2.克隆到本地 2.后端项目环境搭建1.创建一个maven项目2.删除不必要的文件夹3.pom.xml文件引入依赖4.application.yml 配置数据源&#xff08;注意&#xff0c;数据库名还没写&#xff09;5.com/sun/furn/Application.java 编写…

2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作…

【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器

【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器 文章目录 【OpenSSH】Windows系统使用OpenSSH搭建SFTP服务器一、环境说明二、安装配置步骤1.下载完成后&#xff0c;传至服务器或者本机并解压至C:/Program Files/目录下2.打开PowerShell终端3.进入到包含ssh可执行exe文件的文…

每日五道java面试题之springboot篇(一)

目录&#xff1a; 第一题. 什么是 Spring Boot&#xff1f;第二题. Spring Boot 有哪些优点&#xff1f;第三题. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;第四题. 什么是 JavaConfig&#xff1f;第五题. Spring Boot 自动配置原理是什么…

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

小本创业项目哪个比较赚钱?户用光伏加盟如何

随着不可再生能源的不断消耗和环保问题的日益重视&#xff0c;世界各国对新能源的需求都迫在眉睫。而光伏发电在新能源又有独特的优势。而光伏既改变了人们的生活方式也推动了社会的进步和市场经济的发展。那想做小本游戏创业的话可以选择户用光伏加盟吗&#xff1f; 首先要确认…

【微服务】Feign远程调用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;微服务 ⛺️稳中求进&#xff0c;晒太阳 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a;代码可读性差&#xff0c;编程体验不统一参数复杂URL…

332. 重新安排行程(力扣LeetCode)

文章目录 332. 重新安排行程题目描述思路如何理解死循环该记录映射关系 dfs&#xff08;回溯法&#xff09;代码 332. 重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排…