码迷,mamicode.com
首页 > 其他好文 > 详细

NEFU561 方块计算【递归】

时间:2015-04-13 18:52:33      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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 方块计算【递归】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45030049

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!