本文主要是介绍NEFU561 方块计算【递归】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
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 方块计算【递归】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!