0
点赞
收藏
分享

微信扫一扫

NEFU561 方块计算【递归】

八怪不姓丑 2022-07-27 阅读 21


题目链接:

​​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;
}



举报

相关推荐

0 条评论