首页 > 其他分享 >180

180

时间:2023-06-18 19:11:19浏览次数:34  
标签:matrix area int max Character 入口 180

通过回测法求出所有满足的区域,

  • 在回潮的同时记录其入口坐标,入口个数大于1则不符合要求;,

  • 入口个数等于1时,判断其区域大小;

  • 如果存在多个区域,且区域大小相同,则只需记录其大小; 其他情况则需要记录区域最大值和横纵坐标
    图片说明

图片说明
关键代码:

public interface Runnable {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();

        Character[][] matrix = new Character[m][n];
        in.nextLine();

        for (int i = 0; i < m; i++) {
            String[] strs = in.nextLine().split(" ");
            for (int j = 0; j < n; j++) {
                matrix[i][j] = strs[j].charAt(0);
            }
        }

        //最大的区域大小
        int max_area = 0;
        // 记录单入口区域的入口坐标,区域大小
        HashMap<String, Integer> zones = new HashMap<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 'O' && (i == 0 || j == 0 || i == m - 1 || j == n - 1)) {
                    //先假定当前可以为入口
                    int area = calc_area(copy(matrix), i, j, true);
                    if (area > 0) {
                        String key = i + " " + j;
                        zones.put(key, area);
                        if (area > max_area) {
                            max_area = area;
                        }
                    }

                }
            }
        }

        //输出
        String max_entrace = "";
        for (Map.Entry<String, Integer> e : zones.entrySet()) {
            if (e.getValue() == max_area) {
                if (max_entrace.isEmpty()) {
                    max_entrace = e.getKey();
                } else {
                    max_entrace = "more";
                    break;
                }
            }
        }

        if (max_area == 0) {
            System.out.println("NULL");
        } else if (max_entrace == "more") {
            System.out.println(max_area);
        } else {
            System.out.println(max_entrace + " " + max_area);
        }

    }

    public static Character[][] copy(Character[][] a) {
        int m = a.length;
        int n = a[0].length;
        Character[][] matrix = new Character[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = a[i][j];
            }
        }
        return matrix;
    }
    // i, j为入口的区域大小,
    public static int calc_area(Character[][] matrix, int i, int j, boolean flag) {
        if (!flag) {
            // 遍历到边界时,说明有其他入口,则不是单入口
            if (i == 0 || i == matrix.length - 1 || j == 0 || j == matrix[0].length - 1) {
                return 0;
            }
        }

        matrix[i][j] = 'X';
        // 记录区域大小
        int count = 1;

        int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        for (int[] direction : directions) {
            int newX = i + direction[0], newY = j + direction[1];
            if (newX >= 0 && newX < matrix.length && newY >= 0 && newY < matrix[0].length
                && matrix[newX][newY] == 'O') {
                int count1 = calc_area(matrix, newX, newY, false);
                if (count1 == 0) {
                    return 0;
                }
                count += count1;
            }
        }
        return count;
    }

标签:matrix,area,int,max,Character,入口,180
From: https://www.cnblogs.com/123xxc/p/17489593.html

相关文章

  • 【每日一题】Problem 180C. Letter
    原题解决思路每一个字符以前一个字符为基准,来判断自己是upper还是lower,从而找到最少的解最开始的解决思路是,用回溯的方式来解决,即使划分区块该方法也十分耗时,因为每个字符都有两种情况,因此时间复杂度为\(O(2^n)\)将\(1\)的方式修改下,分别用\(num[i][0],num[i][1]\)来......
  • CF 合集 1801-1825
    Codeforces编号在1801-1825之间的Div.1,Div.2only和EDU。*1801.CodeforcesRound857(Div.1)A.TheVeryBeautifulBlanket尝试让每个\(2\times2\)子矩形的异或和均为\(0\)。显然,若矩阵\(A,B\)满足条件,则矩阵\(C_{i,j}=A_{i,j}\oplusB_{i,j}\)也满足......
  • 180116 EM算法资料整理(博客、论文、工具包、视频、书籍、代码,更新ing)
    BlogsHindon和Jordan理解的EM算法ComputationalStatisticsinPythonEM算法及其推广EM算法及其推广学习笔记从最大似然到EM算法浅解EM算法在缺失数据下的极大似然估计R代码Matlab极大似然估计缺失数据Cos424:InteractingwithDataProbabilityCourse关于EM算法的一些......
  • freeswitch透传带SDP的180
     概述freeswitch是一款简单好用的VOIP开源软交换平台。freeswitch对于180/183的消息处理有默认的规则,但是在3GPP的标准中,消息流程会更加复杂,场景更多变。这样就需要我们根据实际环境中的场景定制消息流程。本文只讨论带SDP的183/180消息。环境centos:CentOS release7.0......
  • 2013年工作中遇到的20个问题(Bug):161-180
    161.用户表和超级用户分成2个表,很不合理,查询的时候,非常复杂。162.leftjoin还是很有“市场”的。机构表Org连接User时,想获得user的名字,可能存在,也可能不存在,leftjoin就适合。##多个leftjoin之间不能使用","隔开selectcg.*,u.loginNamecreatorName,org.nativeNameadvertiser......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——GUI 和可用性测试场景
    这是一个针对web应用和桌面应用程序的测试清单假设:假定你的应用程序支持下列功能:-带有多种字段的表单-子窗口-与数据库交互-多种查询过滤规则和结果显示-图片上传-邮件发送-数据导出GUI和可用性测试场景1.页面中的所有字段(如:文本框,单选选项,下拉列表)应该适当对齐2.除特殊指定外,数......
  • 针对 B/S、C/S 架构的 180 个简单测试案例—窗口测试用例
    -测试清单可以提供给开发人员查阅,以保证在开发阶段就避免出现一些常见的问题。几点说明:1)用不同的用户角色执行这些测试场景,如:管理用户,来宾用户等。2)对于web应用,这些场景应该在客户认可的多种浏览器的各个版本上进行测试,如:IE,Firefox,Chrome,Safari等。3)用不同的屏幕分辨率进行测试,如......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——结果表测试场景
    这是一个针对web应用和桌面应用程序的测试清单。假设:假定你的应用程序支持下列功能:-带有多种字段的表单-子窗口-与数据库交互-多种查询过滤规则和结果显示-图片上传-邮件发送-数据导出结果表测试场景1.当结果页面加载时长超过默认时长时,应该显示“页面加载中”之类的提示信息2.检......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——图像上传功能的测试场景(也适用于其他文
    1.检查图片上传路径2.检查图像上传和修改功能3.检查各种扩展图像文件的上传(例如JPEG、PNG、BMP等).4.检查文件名中含有空格或其他可用特殊字符的图片的上传5.检查重复名称图片上传6.图片尺寸大于最大允许值,上传时应该显示适当的错误消息.7.检查上传的图片文件类型外的其它文件......
  • Codeforces 1801D The way home
    看到shortestpaths来做的。首先有一个贪心的策略,对于当前点\(u\)若不能直接往后走则肯定是选择经过的点中\(w_i\)最大的加。很好理解,证明就不需要了。所以可以定义状态\(f_{u,mx}\)为\(u\)点最大能加的值为\(h_{mx}\)的最优状态,\(h\)是\(w\)离散化后的数组。......