题目链接:
http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=561
题目大意:
在一间M*N的长方形房间里,地上铺了白色、黑色两种颜色的正方形瓷砖,你站在其中一块
黑色瓷砖上,只能向相邻的黑色瓷砖移动。问:总共能够达到多少快黑色的瓷砖。
数据中,'.'表示黑色的瓷砖,'#'表示白色的瓷砖,'@'表示你站的这块瓷砖(该瓷砖是黑色的)。
思路:
只能向相邻的黑色瓷砖移动,那么对于位置(x,y),就只能向(x+1,y),(x,y+1),(x-1,y),
(x,y+1)的黑色的瓷砖移动。每次移动的时候看看没走过的瓷砖是不是黑色的瓷砖,如果是就
继续走,否则就返回。用ans存储走过的黑色瓷砖块数,最终递归方程为f(x,y) = f(x+1,y) +
(x,y+1) + (x-1,y) + (x,y+1)。
为了避免重复计算走过的瓷砖数,将每一块走过的瓷砖标记为白色,这样就不会重复计算了。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int N,M;
char Map[35][35];
int DFS(int x,int y)
{
int d = 0;
if(x < 0 || x >= N || y < 0 || y >= M || Map[x][y] == '#')
return 0; //返回,递归边界
if(Map[x][y] == '.' || Map[x][y] == '@')
{
d = 1; //标记,避免重复搜索
Map[x][y] = '#';
}
return DFS(x+1,y) + DFS(x,y+1) + DFS(x-1,y) + DFS(x,y-1) + d;
}
int main()
{
while(~scanf("%d%d",&M,&N) && (N||M))
{
int ans = 0;
for(int i = 0; i < N; ++i)
scanf("%s",Map[i]);
for(int i = 0; i < N; ++i)
for(int j = 0; j < M; ++j)
if(Map[i][j] == '@')
ans = DFS(i,j);
printf("%d\n",ans);
}
return 0;
}