华为OD试题--查找单入口空间区域

题目:

思路:附在代码中

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

/***
 * 思路
 * 1. 使用dfs遍历整个表单,将所有连续的”O“出现的次数全都遍历出来,返回每个连续的”O“的大小
 * 2. 将每个连续的”O“的坐标遍历一遍,找到边界的坐标,并将其存储在set中, 比如{”1 0“,”2 0“}
 * 3. 若set的size为0,则该连续的”0“不满足条件
 *    若set的size为1,将该set的值坐标和该连续的”0“的大小存储在String[2]数组中, 
 *    例如:["3, 0", 6]  并将string[2]数组存储在list<string[]>中
 * 4. 判断list的大小
 *      若list的size为0,输出null
 *      若list的size为1,说明整个表单中只有一个连续的”0“满足条件,将list【0】中的值按题目要求格式输出即可
 *      若list的size不为0和1,说明有多个连续的”O“满足条件,遍历整个list,找到最大的连续的”0“的值maxarea.
 *      再次遍历整个list,将所有的maxarea的坐标的索引找到存放在list2中,
 *      
 *      判断list2的size: 若size为1,将list.get(list2.get(0))的值按照题目要求输出
 *                      若size不为1,将list.get(list2.get(0))的值中的area的大小直接输出就好
 *
 */
public class SearchKongXianArea {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int row = Integer.parseInt(scanner.next());
        int column = Integer.parseInt(scanner.next());
        String[][] arr = new String[row][column];
        for (int i = 0; i < row; i++){
            for (int j = 0; j < column; j++){
                arr[i][j] = scanner.next();
            }
        }


        //将有边界的连续的”0“且边界只有一个的坐标以及area存放在list中
        ArrayList<String[]> list = new ArrayList<>();

        for (int i = 0; i < row; i++){
            for (int j = 0; j < column; j++){
                if (arr[i][j].equals("O")){
                    //请求dfs,将满足边界的坐标存放在set中。
                    HashSet<String> set = new HashSet<>();
                    int area = bfs(arr,i,j,set);
                    if (set.size()==1){
                        String[] strings = {String.valueOf(area),set.iterator().next()};
                        list.add(strings);
                    }

                }
            }
        }
        if (list.size()==0){
            System.out.println("NULL");
            return;
        }

        if (list.size() == 1){
            System.out.print(list.get(0)[1]);
            System.out.print(" "+list.get(0)[0]);
            return;
        }


        int maxArea =0;
        for (int i = 0; i < list.size(); i++){
            int area = Integer.parseInt(list.get(i)[0]);
            if (area > maxArea){
                maxArea = area;
            }
        }

        ArrayList<Integer> index = new ArrayList<>();

        for (int i = 0; i < list.size(); i++){
            int area = Integer.parseInt(list.get(i)[0]);
            if (area == maxArea){
                index.add(i);
            }
        }

        if (index.size()==1){
            System.out.print(list.get(index.get(0))[1]);
            System.out.print(" "+list.get(index.get(0))[0]);
        }else {
            System.out.println(maxArea);
        }




    }


    public static int bfs(String[][] strings, int i, int j, HashSet<String> set){
        if (!isArea(strings,i,j)){
            return 0;
        }
        if (!strings[i][j].equals("O")){
            return 0;
        }
        strings[i][j] = "P";
        if (isBianJie(strings,i,j)){
            set.add(i+" "+j);
        }

        return 1+bfs(strings,i-1,j,set)+bfs(strings,i+1,j,set)+bfs(strings,i,j-1,set)+bfs(strings,i,j+1,set);
    }

    public static boolean isArea(String[][] strings, int r, int c){
        int row = strings.length;
        int column = strings[0].length;
        return r>=0 && r <row && c >=0 && c<column;
    }

    public static boolean isBianJie(String[][] strings,int i, int j){
        int row = strings.length;
        int column = strings[0].length;
        if (i==0){
            return true;
        }
        if (i==row-1){
            return true;
        }
        if (j==0){
            return true;
        }
        if (j==column-1){
            return true;
        }
        return false;

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值