您的位置:首页 > 其它

菜鸟DFS的第一次尝试:1103:红与黑

2017-12-11 15:47 393 查看


题目描述

小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。

请你编程计算小明可以走到的黑色地砖最多有多少块。


输入

输入包含多组测试数据。

每组输入首先是两个正整数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DFS 水题