题目链接:点击打开链接
题目大意:有一个长方形的房间,铺满了正方形瓷砖。每个瓷砖都是红色或黑色的。一个人站在一块黑色的瓷砖上。从一个瓷砖上,他可以移动到四个相邻(上下左右)的瓷砖中的一个。但是他不能移动到红色的瓷砖,只能在黑色的瓷砖上移动。通过重复上面描述的动作,编写一个程序来计算他能达到的黑瓷砖的数量。
输入:多个数据。第一行给出两个数m,n(0,0代表结束输入);m代表列,n代表行。m,n均不超过20。对每一块瓷砖,填入“@”代表人站的初始位置(黑砖),“.”代表黑色砖,“#”代表红色砖.
输出:输出人能踩过的黑色砖的总数(第一块人站的那个也算)。
样例:
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
输出:
45
59
6
13
思路:从第一个@开始搜索,对该瓷砖的上下左右四个方向进行搜索,遇见“.”则继续进行,(这时候把“.”替换成“#”,代表搜过了,避免重搜),ans++(黑砖数+1).
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
char room[21][21]; //初始化房间
int n,m;
int ans;
void dfs(int i,int j){
if(i<0||i>=n||j<0||j>=m||room[i][j]=='#') //判断是不是超出了范围
return ;
ans++;
room[i][j]='#'; //搜到“.”后先替换成“#”
dfs(i-1,j);dfs(i+1,j);dfs(i,j+1);dfs(i,j-1);//四个方向进行搜索
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m==0&&n==0)
{
break;
}
else{
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
cin>>room[i][j];
}
}
ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(room[i][j]=='@')
dfs(i,j);
}
}
printf("%d\n",ans);
}
}
return 0;
}
上述代码中用cin读入room数组的方法优化:
for(int i=0;i<n;i++){
scanf("%s",&room[i]);
getchar(); //再把这个回车接收
} ps:这样就能完全不用C++的东西了,注释掉#include<iostream> 和using namespace std;在运行吧。