题目链接:
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; }
时间: 2024-10-15 22:09:08