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

NEFU561 方块计算【递归】的相关文章

数式计算(递归解法)

1 /** 2 *注:1.有一个bug(以及未知什么bug) 我已知的是: ([email protected])(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要([email protected])@n 3 4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 [email protected]([email protected])也不可以)...不知道为什么()表达式后面没有操作时会异常退出. 5 *不知道如何解决.希望感兴趣的人帮帮忙! 6

关于递归次数的计算

有这样一个题目: 递归函数: 1 int x(int n) 2 { 3 if(n<=3) 4 { 5 return 1; 6 } 7 else 8 { 9 return x(n-2)+x(n-4)+1; 10 } 11 } 计算x(x(8))递归调用次数. 大多数可能觉得这是一个很简单的题目,的确很简单. 但是要想在没有编译器的情况下正确的算出这个递归 调用次数其实还是需要点耐心. x(x(8))我们先计算x(8),我们用count=0计数递归调用次数 1.x(8)=x(6)+x(4)+1 co

动态规划 数字三角形(递归,递推,记忆化搜索)

题目要求: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数字为 0 - 99 输入格式: 5 //三角形行数.下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 解题思路: 用二维数组存放数字三角形 D[r][j] //表示第i行第j个元素的

动态规划入门-数字三角形(从朴素递归到各种优化)

数字三角形(POJ1163) Description 73 88 1 02 7 4 44 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径.三角形的行数大于1小于等于100,数字为 0 - 99 输入格式:5 //三角形行数.下面是三角形73 88 1 02 7 4 4 4 5 2 6 5 要求输出最大和 Sample Output 30 Source IOI 1994

大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式2.1.2 GraphX 存储模式2.2 vertices.edges 以及 triplets2.2.1 vertices2.2.2 edges2.2.3 triplets2.3 图的构建2.3.1 构建图的方法2.3.2 构建图的过程2.4 计算模式2.4.1 BSP 计算模式2.4.2 图操作一

算法录 之 复杂度分析。

一个算法的复杂度可以说也就是一个算法的效率,一般来说分为时间复杂度和空间复杂度... 注意接下来说的均是比较YY的,适用与ACM等不需严格分析只需要大致范围的地方,至于严格的算法复杂度分析的那些数学证明,主定理什么的在<算法导论>这本书上有十分详细的讲解,网上应该也会有人写过,这里就不多说了(其实,是我不会而已o(╯□╰)o...). — 到底啥是复杂度呢?先来个栗子. 小明有10个苹果,有一天他饿了,然后准备吃掉一个苹果,但是小明有中二病,他要吃里面重量最大的那个,于是...他需要一个找到那

动态规划——入门篇

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难.网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从.我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升.话不多说,接下来,下面我就通过一个例子来一步一步讲解动态规划是怎样使用的,只有知道怎样使用,才能更好地理解,而不是一味地对概念和原理进

python数据结构与算法——二叉树结构与遍历方法

先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # 访问结点,遍历左子树,如果左子树为空,则遍历右子树, # 如果右子树为空,则向上走到一个可以向右走的结点,继续该过程 preorder(t):    if t:       print t.value       preorder t.L       preorder t.R # 中序遍历 # 从根

欧几里德算法(最大公约数算法)完整分析

欧几里德算法又称为辗转相除法,用于计算两个非负整数的最大公因数.其伪代码如下: gcd(a, b) //要求保证传入的a>=b if(b == 0) return a return gcd(b, a % b) 首先说明这个函数能返回a与b的最大公因数.但是我们不从代码到原理,我们要从原理返回代码.(下面的出现的所有符号均为非负整数) 在a与b均非0且a>=b的情况下,若c是a和b的最大公因数(c>0),那么就有c|a和c|b的同时成立.显然a=i*c,b=j*c,此处应满足1<=j