zoukankan      html  css  js  c++  java
  • 牛客网编程练习之编程马拉松:红与黑

    题目描述

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

    输入描述:

    输入包含多组数据。

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

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

  • 相关阅读:
    关于“每日代码系列”以及后续计划
    每日代码系列(22)
    每日代码系列(21)
    mvcc
    父进程是1号进程产生大量的僵尸进程的解决方案
    nginx学习之路
    Zookeeper Curator 分布式锁
    jvm垃圾收集器汇总
    MySql分库分表以及相关问题
    Https交互原理
  • 原文地址:https://www.cnblogs.com/cc11001100/p/8040659.html
Copyright © 2011-2022 走看看