问题 A: 【基础】红与黑 【递归】
时间限制: 1 Sec 内存限制: 128 MB
提交: 244 解决: 152
[提交][状态][讨论版]
题目描述
描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
输入
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)'.':黑色的瓷砖;
2)'#':白色的瓷砖;
3)'@':黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出
输出
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
样例输入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0
样例输出
45
提示
[提交][状态]
解题思路:题目要求从@出发,走遍所有的黑瓷砖,找出最长的路,按照宽搜的思路的话,每一次都让他向周边(上下左右),走一步,然后每一步再递归调用函数继续往下走,如果遇到边界,或者白瓷砖,则return这个函数,否则的话要对这个位置进行标记(标记为白瓷砖)防止走多遍。最后剩下的肯定是走了最多,步长最大的。
代码示例:
package m1; /** * @createTime 2018-3-28 10:45 * * @author谢彦杰 * * @题目名【基础】红与黑【递归】 * */ import java.util.*;
public class A { static int row, column,count = 0; static String[][] arr; static int[][] dir = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };// 方向数组
public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int i, j, Px = 0, Py = 0; String str; while (true) { column = in.nextInt(); row = in.nextInt(); if (column == 0 && row == 0) { return; } arr = new String[row + 2][column + 2]; for (i = 1; i <= row; i++) { str = in.next(); for (j = 1; j <= column; j++) { arr[i][j] = str.charAt(j - 1) + ""; if (arr[i][j].equals("@")) { Px = i; Py = j; } } } dfs(Px, Py); System.out.println(count); count=0; } }
static void dfs(int Px, int Py) { // 判断如果处于边界或者是白砖,则直接返回 if (Px < 1 || Px > row || Py < 1 || Py > column || arr[Px][Py].equals("#")) { System.out.println(count); return; } else { count++; arr[Px][Py] = "#"; dfs(Px + dir[0][0], Py + dir[0][1]); dfs(Px + dir[1][0], Py + dir[1][1]); dfs(Px + dir[2][0], Py + dir[2][1]); dfs(Px + dir[3][0], Py + dir[3][1]); } } } |