概述
题目描述
小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。
输入格式
输入包含多组测试数据。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。
输出
对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。
样例输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
样例输出
45
59
6
13
#include<cstdio>
int dis[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
char ci[21][21];
int w,h,s;
void dfs(int x,int y){
int nx,ny,k;
s++;
ci[x][y]='#';//标记走过的路 防止重复搜
for( k=0;k<4;k++){
nx=x+dis[k][0];
ny=y+dis[k][1];
if(nx>=0&&ny>=0&&nx<h&&ny<w&&ci[nx][ny]=='.')//判断的是标记后的下一个位置属性
dfs(nx,ny);//若能继续搜 则继续搜 否则退回前一个坐标,继续搜
//相当与能dfs就入栈,不能就出栈,再操作栈顶元素(继续搜)
// 所以nx ny始终等于能继续往下搜才进行上下左右操作;
}
return;
}
int main(){
while(scanf("%d%d",&w,&h)&&(w||h)){
s=0;
for( int i=0;i<h;i++)
scanf("%s",ci[i]);
for( int i=0;i<h;i++)
for(int j=0;j<w;j++)
if(ci[i][j]=='@')
dfs(i,j);
printf("%dn",s);
}
return 0;
}
//办法2
//源代码源于网络 稍加修改
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=20+5;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
bool a[maxn][maxn],vis[maxn][maxn];
int w,h,ans=0;
bool can(int xx,int yy)
{
if (xx<1||xx>h||yy<1||yy>w||!a[xx][yy]||vis[xx][yy]) return false;
return true;
}
void dfs(int xx,int yy)
{
vis[xx][yy]=true;//标记走过的路
ans++;
for (int i=0;i<4;i++)
{
xx+=dx[i];
yy+=dy[i];
if (can(xx,yy)) //每次判断的是下一个位置是否能搜,即vis为false 所以想要回到前一个位置继续判断需要进行1,2操作,而办法1则不同
dfs(xx,yy);
xx-=dx[i]; //1
yy-=dy[i]; //2
}
return;
}
int main()
{
char ch;
int xx,yy;
while(scanf("%d%d",&w,&h)==2&&w)
{
ans=0;
memset(a,0,sizeof(a));//清空数组
memset(vis,0,sizeof(vis));//清空数组
scanf("%c",&ch);
for (int i=1;i<=h;i++)
{
for (int j=1;j<=w;j++)
{
scanf("%c",&ch);
if (ch=='.') a[i][j]=1;
else if (ch=='@')
{
xx=i;
yy=j;
}
}
scanf("%c",&ch);
}
dfs(xx,yy);
printf("%dn",ans);
}
return 0;
}
最后
以上就是成就火车为你收集整理的HNCU1103:红与黑(DFS)的全部内容,希望文章能够帮你解决HNCU1103:红与黑(DFS)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复