题目描述
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
请你编程计算小明可以走到的黑色地砖最多有多少块。
输入
输入包含多组测试数据。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
输出
对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖
题解:
第一次写出来的DFS,纪念一波。。。求各位大佬不要喷。。。。当然有问题请求帮忙指出来。。。谢谢。。。
#include<cstdio>
#include<iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
char a[30][30];//申请地砖数量
int m,n,v=0;//全局变量计数器,输入地板大小
void fhs(int x,int y) {//dfs搜索
a[x][y]='#';//确定格子已经走过
for(int x1=x-1; x1<=x+1; x1++)
{
if(x1>=0&&x1<m&&y>=0&&y<n&&a[x1][y]=='.') {//搜索左右
v++;//计数器加一
fhs(x1,y);//深搜这个格子旁边有无格子;
}
}
for(int y1=y-1; y1<=y+1; y1++)
{
if(y1>=0&&y1<n&&x>=0&&x<m&&a[x][y1]=='.') {//搜索上下
v++;//计数加一
fhs(x,y1);//深搜
}
}
}
void shuru() {//输入
scanf("%d%d",&n,&m);
for(int v1=0; v1<m; v1++) {//和学长看齐
scanf("%s",a[v1]);
}
}
int main() {
shuru();
for(int t=0; t<m; t++) {
for(int w=0; w<n; w++) {
if(a[t][w]=='@'/*查找第一块格子*/) {
fhs(t,w);//开始深搜
break;
}
}
}
printf("%d",++v);//加第一个格子
return 0;
}