`

poj 1979(递归)

poj 
阅读更多

1979:Red and Black

总时间限制:
1000ms
内存限制:
65536kB
描述
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.
输入
The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

'.' - a black tile
'#' - a red tile
'@' - a man on a black tile(appears exactly once in a data set)
The end of the input is indicated by a line consisting of two zeros.
输出
For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).
样例输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
样例输出
45
59
6
13
翻译:大致题意如下:
问题描述:有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
 
输入:包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
‘.’:黑色的瓷砖
‘#’:白色的瓷砖
‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次
当在一行中读入的是两个零时,表示输入结束。
输出:对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)
 
解决方法:算法:设f(x,y)为从点(x,y)出发能够走过的黑瓷砖总数,则
    f(x,y) = 1+f(x-1,y)+f(x+1,y)
                    +f(x,y-1)+f(x,y+1)
这里需要注意,凡是走过的瓷砖不能够被重复走过。
如何解决这一问题,有个好方法就是我们把走过的砖变为白砖,这样问题句简单了。
 
解决方案: Java
import java.util.Scanner;

/**
 * 黑瓷砖上行走
 * @author tanlvxu
 *
 */
public class Main{
   char rect[][] = new char[22][22] ;
	public static void main(String[] args) {
		
     new Main().test() ;
	}
	public int count(int sCol,int sRow)
	{
		if(rect[sCol][sRow]=='#')
			return 0 ;
		else rect[sCol][sRow] = '#' ;
		return 1+count(sCol-1,sRow)+count(sCol,sRow-1)+count(sCol+1,sRow)+count(sCol,sRow+1);
	}
	
    public void test()
    {
    	Scanner sc = new Scanner(System.in) ;
    	int W = sc.nextInt() ;
    	int H = sc.nextInt() ;
    	while(W!=0)
    	{
    		int i,j,sCol=0,sRow=0 ;
    		//初始化,把数组全部设为白瓷砖
    		for(i=0;i<22;i++)
    			for(j=0;j<22;j++)
    				rect[i][j] = '#';
    		//读入数据
    		for(i=1;i<=H;i++){
    			String s = sc.next() ;
    			for(j=1;j<=W;j++)
    			{    rect[i][j] = s.charAt(j-1) ;
    				if(rect[i][j]=='@')
    				{
    					sCol = i ;
    					sRow = j ;
    					rect[i][j] = '.' ;
    				}    				
    			}
    		}
    		System.out.println(count(sCol,sRow));
    		 W = sc.nextInt() ;
        	 H = sc.nextInt() ;
    		
    	}
    }
 
这个问题和滑雪问题很相似,可以参照滑雪难题来考虑这一类型的问题。
分享到:
评论

相关推荐

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ算法题目分类

    * 递归和分治法:递归和分治法是指将问题分解成多个小问题,通过解决小问题来解决大问题,如 poj3295。 * 递推:递推是指通过前一个结果来计算当前结果的方法,如 poj1068、poj2632、poj1573、poj2993、poj2996。 * ...

    poj2775.rar_poj_poj 27_poj27_poj2775

    综合以上信息,我们可以推测这个压缩包是为了帮助用户理解和解决POJ平台上的第2775号编程挑战,重点在于理解并实现一个涉及递归的算法。学习这个题目不仅可以提高编程技巧,还能深入理解递归思想及其在实际问题中的...

    poj题目分类

    * 递归和分治法:通过将问题拆分成小问题来解决,例如 poj3295。 * 递推法:通过逐步解决问题来获得最终解,例如 poj1068、poj2632、poj1573、poj2993、poj2996。 * 构造法:通过构造解来解决问题,例如 poj3295...

    ACM-POJ 算法训练指南

    2. **记忆化搜索**:结合动态规划和递归搜索(POJ3254, poj2411, poj1185)。 3. **多维动态规划**:处理多个维度的状态(poj2057, poj1947, poj2486, poj3140)。 ### 十五、进阶数学 1. **数列和级数**:数列...

    poj各种分类

    这种策略在poj3295这类构造法题目中尤为适用,同时也常见于递归和动态规划中。 #### 模拟法 模拟法是对题目场景的直接模拟,适用于逻辑清晰、规则明确的问题,如poj1068和poj2632。虽然这种方法直观易懂,但在...

    POJ题目分析与理解

    1. 算法分类:POJ题目可以根据算法的难度和类型进行分类,例如,动态规划、贪心算法、递归算法等。 2. 题目分类:POJ题目可以根据题目类型进行分类,例如,数学题、字符串处理题、图算法题等。 3. 代码长度分类:POJ...

    POJ1840-Eqs

    6. **递归与回溯**:在解决某些复杂问题时,可能会用到递归或回溯法,如八皇后问题、迷宫问题等。 7. **贪心策略**:在某些情况下,可以采用贪心算法,每次做出局部最优决策,最终达到全局最优。 8. **模拟**:...

    POJ题目简单分类(ACM)

    - **递归与分治**:将大问题分解为小问题解决,如快速排序、归并排序等。 - **递推**:用递推公式解决复杂问题,如斐波那契数列。 - **构造法**:直接构造出满足条件的解,如poj3295。 - **模拟法**:按照题目...

    POJ1017-Packets

    6. **编程技巧**:比如循环、条件判断、递归等编程基本技巧,以及如何优化代码以满足时间限制。 7. **调试技巧**:了解如何使用调试工具,如gdb,以找出代码中的错误。 8. **测试用例设计**:理解如何构建有效的...

    POJ1003-Hangover

    AC代码则展示了如何用C++语言将这些思路转化为可执行的程序,其中可能运用了数组、字符串操作、循环、条件判断、递归、动态规划等基本编程元素,也可能涉及高级算法如贪心、二分查找、图论等。 为了深入理解这个...

    POJ1472-Instant Complexity

    6. **递归或迭代**:根据问题特点,可能需要使用递归或迭代的方式来解决问题。 7. **测试用例设计**:如何构造测试用例以覆盖所有可能的情况,确保代码的健壮性。 8. **在线判题系统**:了解POJ或其他在线判题平台...

    西北工业大学poj

    3. "第四季函数":这部分可能涵盖函数的使用、递归、高阶函数等,是深入理解函数式编程和C++函数机制的关键。 4. "第三季枚举":枚举算法通常用于遍历所有可能的情况来求解问题,这在解决一些组合优化或图论问题时...

    POJ1753.rar_poj 1753_poj1753

    文件名暗示这是一个关于“翻转游戏”的问题,可能涉及到数组操作、动态规划或者递归等算法。 综合以上信息,我们可以推测POJ1753是一个与“翻转游戏”相关的编程挑战,可能要求参赛者编写程序来找出游戏中最优的...

    POJ1416-Shredding Company

    在这个问题中,AC代码通常会包含对动态规划状态的定义、状态转移方程的建立以及递归或迭代的实现过程。 【标签】"POJ 1416 Shredding Company" 这个标签直接指明了题目来源和主题,便于用户搜索和分类。 【文件...

    经典 的POJ 分类

    - POJ 2948、POJ 1925:递归动态规划的应用。 #### 状态压缩 - **题目示例**: - POJ 2057、POJ 1947:状态压缩技术的实现与优化。 ### 数学问题 #### 概率统计 - **题目示例**: - POJ 2947、POJ 1487:概率...

    ACM.zip_ACM_poj_poj3187_poj3669

    解题过程中,可能会使用STL(Standard Template Library)中的容器和算法,如vector、set、map、algorithm等,也可能涉及到指针、递归、模板等高级特性。 标签"acm poj poj3187 poj3669"进一步确认了这个压缩包的...

    POJ3295-Tautology

    栈是一种后进先出(LIFO)的数据结构,常用于处理递归或回溯问题,也可能是为了处理逻辑表达式的求值。 3. "POJ3295-Tautology.doc":这可能是一个Word文档,包含了详细的解题报告,包括问题分析、算法设计、代码...

    POJ1027-The Same Game

    3. 递归与回溯:可能的解决方案之一是通过递归尝试所有可能的消除顺序,再回溯到最优解。 4. 状态压缩:在处理棋盘状态时,可能需要使用位运算进行状态压缩,以节省空间。 5. 代码优化:如何写出高效且易于理解的...

    强大的poj分类

    - POJ 2182 - Fractal(利用递归和分治思想求解) - POJ 2264 - The Die Is Cast(哈希表应用) **相关知识点**: - 不同数据结构的特点及其应用场景 - 动态数组与静态数组的区别 - 栈和队列在实际问题中的应用案例...

Global site tag (gtag.js) - Google Analytics