一道简单的深度搜索题
思路很简单
蒜厂有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。
请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入格式
第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。WW 和 HH 都不超过 2020。
在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下
1)’.’:黑色的瓷砖;
2)’#’:白色的瓷砖;
3)’@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
输出格式
输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
6 9
…#.
…#
…
…
…
…
…
#@…#
.#…#.
样例输出
45
首先,先处理一下地图,将字符转为数组形式便于处理
然后,标明剪枝条件,即数组越界或者此点已被搜索。
最后找出起始点搜索一下就行了。 ``
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[100][100];
int vis[100][100];
void dfs(int n,int m)
{
//越界或走过判断
if(n<0||n>=30||m<0||m>=30)
return ;
if(vis[n][m]==1) return ;
//走过标记
vis[n][m]=1;
//对上下左右进行搜索,如果有点符合条件,计改点10作为标志
if(a[n+1][m]==1)
{
a[n+1][m]=10;
dfs(n+1,m);
}
if(a[n][m+1]==1)
{
a[n][m+1]=10;
dfs(n,m+1);
}
if(a[n-1][m]==1&&n>0)
{
a[n-1][m]=10;
dfs(n-1,m);
}
if(a[n][m-1]==1&&m>0)
{
a[n][m-1]=10;
dfs(n,m-1);
}
}
int main()
{
int w,h;//地图大小
cin>>w;
cin>>h;
//处理地图,1代表可走,0代表不可走,2代表出发点
char s[1000];
int x=-1,y=-1;
for(int i=0;i<h;i++)
{
scanf("%s",s);
for(int j=0;j<w;j++)
{
if(s[j]=='.')
a[i][j]=1;
if(s[j]=='#')
a[i][j]=0;
if(s[j]=='@')
{
//记录起始点作为搜索对象
a[i][j]=2;
x=j;
y=i;
}
}
}
//进行搜索
dfs(y,x);
//计数 点为10即符合条件
int cnt=0;
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(a[i][j]==10)
cnt++;
}
}
cnt++;
cout << cnt << endl;
}
来源:CSDN
作者:naiue
链接:https://blog.csdn.net/naiue/article/details/103235221