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

在这里插入图片描述

posted @ 2021-10-20 15:30  小汤同学  阅读(36)  评论(0编辑  收藏  举报