NOI / 2.5基本算法之搜索-1818:红与黑

news/2024/11/16 8:58:06/

总时间限制: 1000ms                内存限制: 65536kB

描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入

包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。

输出

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

样例输入

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

样例输出

45

来源

1979

题目来源->传送门,点击后传送至题目。

讲解

想法:从起点开始进行深搜,上下左右四个方向进行深搜,每搜到一个地方累加的变量的值就加1,然后再从新结点进行一次深搜,直到深搜递归正常返回之后,黑砖的数量也就算出来了,主函数只需要在输出就行了。

首先需要两个增量数组,分别表示新结点与原来的结点之间的关系,一个是x坐标,一个是y坐标,上下左右顺序无所谓,但需要配对。

int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};

我们还需要一个状态数组,用来标记每个结点是否走过,不能重复走,每标记一个黑砖,状态则标记为走过。

int v[25][25]={0};

 如何找起点?只需要在输入的时候边输入边判断,只要为@,就把他的坐标存起来就行了。

for(i=1;i<=h;i++)//行
for(j=1;j<=w;j++)//列
{//输入cin>>a[i][j];//输入房子内的瓷砖。if(a[i][j]=='@')//起点x=i,y=j;//标记起点的位置。
}

最终代码+注释

#include<bits/stdc++.h>
using namespace std;
int v[25][25],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},t,w,h;
char a[25][25];//必须定义全局变量。
void dfs(int x,int y)//深度优先搜索函数
{int tx,ty,i;//必须定义局部变量for(i=0;i<4;i++)//拓展四个方向。{tx=x+dx[i],ty=y+dy[i];//计算新结点的横坐标和纵坐标。if(tx>=1&&tx<=h&&ty>=1&&ty<=w&&a[tx][ty]!='#'&&v[tx][ty]==0){//如果新结点合法t++;//可以走的黑砖数量加一v[tx][ty]=1;//标记走过。dfs(tx,ty);//继续拓展新结点。}}
}
int main()
{int i,j,x,y;//x和y放置起点的坐标。while(1){//一直循环。嗯memset(v,0,sizeof(v));t=1;//初始化cin>>w>>h;//列数与行数if(w==0&&h==0)//如果读入的是两个零时。return 0;//表示输入结束。for(i=1;i<=h;i++)//行for(j=1;j<=w;j++)//列{//输入cin>>a[i][j];//输入房子内的瓷砖。if(a[i][j]=='@')//起点x=i,y=j;//标记起点的位置。}v[x][y]=1;//标记起点已经走过。dfs(x,y);//拓展起点,计算一共可以走多少个黑瓷砖cout<<t<<endl;//输出结果}return 0;//结束程序
}

给个点赞、关注支持支持呗(^_^)

如果有不懂的的问题,可以留在评论区里,我会尽快回复的(✪ω✪)


http://www.ppmy.cn/news/244195.html

相关文章

Android adb shell后面可用的常用命令详细列举

adb shell 后面可以跟的常见命令有如下&#xff1a; am app_process backup bootanimation coloradjust dpm idmap input media requestsync settings svc uiautomator appops appwidget bmgr bu content hid ime interrupter pm screencap sm telecom wm dumpsys logcat getpr…

f4v文件解析

经过几天日夜,对照 flv_video_file_format_spec_v10_1.pdf,用C写了个f4v文件分析工具。也适应mp4文件分析。 原始文件为 sky.f4v 由ffmpeg生成(ffmpeg -i sky.mov sky.f4v) 链接: https://pan.baidu.com/s/1asrSPJZq1Zv4zQaYqgDsRg 密码: frec flv.exe (./flv sky.f4v)…

v-if,v-else-if, v-else的实际使用

需求是医疗水平&#xff0c;价格水平&#xff0c;服务态度分值都为0-10分&#xff0c;1-4分是红色&#xff0c;5-7分是黄色&#xff0c;8-10分是绿色&#xff0c;数据均从后台请求过来的。 一开始想的是通过Vue中ref属性&#xff0c;可以获取到当前元素&#xff0c;在数据请求…

我在公司彻夜加班,老板居然做出这种事.....

讲道理&#xff0c;我的学历远达不到BAT等名企大厂的要求&#xff0c;去不了好公司我认了&#xff0c;大专毕业的我在找工作的时候发现留给自己的机会并不多&#xff0c;最后去了一家不知名的小公司。入职后才发现这家公司其实就是个外包公司&#xff0c;里面的业务部门和制度相…

智慧加油站解决方案,提高加油区和卸油区的安全性和效率

英码科技智慧加油站解决方案是一个综合应用了AI智能算法的视觉分析方案&#xff0c;旨在提高加油区和卸油区的安全性和效率。 加油区算法&#xff1a; 吸烟检测&#xff1a;通过AI算法分析视频流&#xff0c;检测是否有人在加油区域吸烟&#xff0c;以防止火灾风险。 打电话…

Java中Object类常用的11个方法

Java中Object类常用的11个方法 先看下 Object 的类结构&#xff08;快捷键&#xff1a;alt7&#xff09;&#xff1a; 1. getClass 方法&#xff08;获取类的class对象。&#xff09; public final native Class<?> getClass();final 方法、获取对象的运行时 class …

速度无敌

无奈blogspot总是受到长城的关心&#xff0c;无法安心写东西。要么写不了&#xff0c;要么看不到&#xff0c;无奈无语。 还要重拾cnblogs的博客&#xff0c;混杂在各位技术员里面的博客感觉还是很好地&#xff0c;在下在这里滥竽充数一下。忘各位程序员大大不要计较我这个普通…

各大品牌配件在厦门电子城的代理商汇总

发信人: MuRong (←┄┄熊猫少爷┄┄→), 信区: ITMarket标 题: 各大品牌配件在厦门电子城的代理商汇总发信站: 鼓浪听涛 (2004年11月29日17:45:06 星期一), 站内信件 主要内容来自tyy站友以前的整理。 各大品牌配件在厦门电子城的代理商汇总 CPU&#xff1a;Intel创捷、百…