標籤:
題目連結:
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;}
NEFU561 方塊計算【遞迴】