您的位置:首页 > 编程语言

牛客网编程练习之编程马拉松:红与黑

2017-12-14 23:57 344 查看

题目描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入描述:

输入包含多组数据。

每组数据第一行是两个整数 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
[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);
}

}

}

 

题目来源: https://www.nowcoder.com/practice/5017fd2fc5c84f78bbaed4777996213a?tpId=3&tqId=10879&tPage=1&rp=&ru=/ta/hackathon&qru=/ta/hackathon/question-ranking

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: