• 7-3 java高级 22_19寻找最大块的问题 (20 分)


    寻找最大正方形块的问题,设计一个动态编程的算法,输入一个10*10的方格矩阵,矩阵元素为0或1,查找包含1值的最大块,输出左上角和右下角坐标,左上角坐标设为0.0。

    输入格式:

    输入一个10*10的方格矩阵,矩阵元素为0或1。

    输出格式:

    输出左上角和右下角坐标。

    输入样例:

    在这里给出一组输入。例如:

    0 1 0 1 1 0 1 0 1 1
    0 1 0 1 1 0 1 1 1 1
    0 1 0 1 1 0 1 1 1 1
    0 1 0 1 1 0 1 1 1 1
    0 1 1 1 1 1 1 0 1 1
    0 1 1 1 1 0 1 0 1 1
    0 1 1 1 1 0 1 0 1 1
    0 1 1 1 1 0 1 1 1 0
    0 1 0 1 1 0 1 1 1 1
    0 1 0 1 1 0 1 0 1 1
    

    输出样例:

    在这里给出相应的输出。例如:

    (4,1)(7,4)
    

    题解

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Main{
        public static void main(String[] args) {
            Scanner input=new Scanner(System.in);
            int[][] metrx=new int[10][10];
            int n=10;
            List<List<Integer>> ones=new ArrayList<List<Integer>>();
            for (int i=0;i<10;i++){
                String[] x=input.nextLine().split(" ");
                List<Integer> FirstRow=new ArrayList<Integer>();
                FirstRow.add(i);
                for (int j=0;j<10;j++){
                    metrx[i][j]= Integer.parseInt(x[j]);
                    if (Integer.parseInt(x[j])==1) {
                        FirstRow.add(j);
                    }
                }
                ones.add(FirstRow);
            }
            int maxsize=0,startx=0,starty=0,endx=0,endy=0;
            for (List<Integer> e:ones){
                for (int i=1;i<e.size();i++){
                    for (int k=(int) Math.sqrt(maxsize);k<9;k++) {
                    	if (e.get(0)+k>9||e.get(i)+k>9) break;
                    	else if (metrx[e.get(0)+k][e.get(i)+k]==1 && is_ones(metrx,e.get(0),e.get(i),e.get(0)+k,e.get(i)+k)) {
                    		maxsize=k*k;
                            startx=e.get(0);
                            starty=e.get(i);
                            endx=e.get(0)+k;
                            endy=e.get(i)+k;
                    	}
                    }
                }
            }
            System.out.println("("+startx+","+starty+")("+endx+","+endy+")");
        }
        public static boolean is_ones(int[][] metrx, int startx, int starty, int endx, int endy) {
            boolean flag = true;
            for (int i=startx;i<=endx&&flag;i++){
                for (int j=starty;j<=endy;j++) {
                    if (metrx[i][j] == 0) {
                        flag=false;
                        break;
                    }
                }
            }
            return flag;
        }
    }
    
    
    
    

    在这里插入图片描述

    另类:

    如果不是方形而是普通的矩形

    package lab04;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class test03 {
        public static void main(String[] args) {
            Scanner input=new Scanner(System.in);
            int[][] metrx=new int[10][10];
            int n=10;
            List<List<Integer>> ones=new ArrayList<List<Integer>>();
            for (int i=0;i<10;i++){
                String[] x=input.nextLine().split(" ");
                List<Integer> FirstRow=new ArrayList<Integer>();
                FirstRow.add(i);
                for (int j=0;j<10;j++){
                    metrx[i][j]= Integer.parseInt(x[j]);
                    if (Integer.parseInt(x[j])==1) {
                        FirstRow.add(j);
                    }
                }
                ones.add(FirstRow);
            }
            int maxsize=0,startx=0,starty=0,endx=0,endy=0;
            for (List<Integer> e:ones){
                for (int i=1;i<e.size();i++){
                    for (int k=e.get(0);k<10;k++){
                        for (int j=1;j<ones.get(k).size();j++){
                            if (ones.get(k).get(j)<=e.get(i)) continue;
                            else if ((k-e.get(0)+1)*(ones.get(k).get(j)-e.get(i)+1)<maxsize) continue;
                            else if (is_ones(metrx,e.get(0),e.get(i),k,ones.get(k).get(j))) {
                                maxsize=(k-e.get(0)+1)*(ones.get(k).get(j)-e.get(i)+1);
                                startx=e.get(0);
                                starty=e.get(i);
                                endx=k;
                                endy=ones.get(k).get(j);
    //                            System.out.println("("+startx+","+starty+") to ("+endx+","+endy+"),maxsize="+maxsize);
                            }
                            else continue;
                        }
                    }
                }
            }
            System.out.println("("+startx+","+starty+") to ("+endx+","+endy+"),maxsize="+maxsize);
        }
        public static boolean is_ones(int[][] metrx, int startx, int starty, int endx, int endy) {
            boolean flag = true;
            for (int i=startx;i<=endx&&flag;i++){
                for (int j=starty;j<=endy;j++) {
                    if (metrx[i][j] == 0) {
                        flag=false;
                        break;
                    }
                }
            }
            return flag;
        }
    }
    // eg.
    //1 0 0 1 1 1 1 1 0 1
    //1 1 1 1 0 0 0 0 0 0
    //0 1 0 1 0 1 0 0 0 0
    //0 0 0 1 0 1 0 1 1 1
    //1 0 1 1 1 0 0 0 0 1
    //0 1 1 1 1 1 0 1 1 0
    //1 1 1 1 1 1 0 0 1 1
    //0 1 0 0 1 0 1 0 1 0
    //0 1 0 0 0 1 1 0 0 1
    //1 1 0 1 1 0 1 0 0 0
    
    

    在这里插入图片描述

  • 相关阅读:
    如何解决无法成功git commit 和git push
    orleans 项目调试注意
    silo 主机 配置
    asp.net core 项目引用包版本问题
    C# async 方法怎么被正确的消费 (新篇)
    C# 虚方法 复习
    C# dynamic 适用场景进一步说明
    [MySQL]
    C# Subject 观察者模式
    C# 协变与逆变
  • 原文地址:https://www.cnblogs.com/tangkc/p/15429035.html
Copyright © 2020-2023  润新知