牛客网编程练习之编程马拉松:红与黑
题目描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入描述:
输入包含多组数据。
每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:
1. “.”:黑色的瓷砖;
2. “#”:白色的瓷砖;
3. “@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
输出描述:
对应每组数据,输出总共能够到达多少块黑色的瓷砖。
示例1
输入
9 6
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
输出
45
采用简单的遍历、标记即可。
AC代码:
import java.util.Scanner; /** * @author CC11001100 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextLine()){ int n = sc.nextInt(); int m = sc.nextInt(); sc.nextLine(); char[][] map = new char[n][m]; for(int i=0; i<n; i++){ map[i] = sc.nextLine().toCharArray(); } System.out.println(resolve(map)); } } private static int resolve(char[][] map){ int startX = -1; int startY = -1; loop: for(int i=0; i<map.length; i++){ for(int j=0; j<map[i].length; j++){ if(map[i][j]=='@'){ startX = i; startY = j; break loop; } } } map[startX][startY] = 'o'; dfs(map, startX, startY); int res = 0; for(int i=0; i<map.length; i++){ for(int j=0; j<map[i].length; j++){ if(map[i][j]=='o'){ res++; } } } return res; } private static final Integer[][] next = new Integer[][] { {0, -1}, {1, 0}, {0, 1}, {-1, 0} }; private static void dfs(char[][] map, int x, int y){ for(int i=0; i<next.length; i++){ int nextX = x + next[i][0]; int nextY = y + next[i][1]; if(nextX<0 || nextX>=map.length || nextY<0 || nextY>=map[x].length){ continue; } if(map[nextX][nextY] == '#' || map[nextX][nextY]=='o'){ continue; } map[nextX][nextY] = 'o'; dfs(map, nextX, nextY); } } }