寻找最大子方阵

题目描述

给定一个元素为0或1的方阵,编写一个程序,找出其中最大的子方阵,使得该子方阵的元素都是1。程序先提示用户输入矩阵的行数,然后提示用户输入矩阵内容,打印输出最大子方阵的第一个元素的位置以及最大子方阵的行数。假定矩阵最多有100行。下面是样例运行:

Enter the number of rows for the matrix: 5  ~Enter
Enter the matrix row by row:
1  0  1  0  1  ~Enter
1  1  1  0  1  ~Enter
1  0  1  1  1  ~Enter
1  0  1  1  1  ~Enter
1  0  1  1  1  ~Enter
The maximum square submatrix is at (2,2) with size 3

程序中应实现下面的函数来寻找最大子方阵:
vector <int> findLargestBlock (const vector <vector <int>> & m)
返回值是一个向量,包含3个值,前两个值代表该最大子方阵第一个元素的行标和列标,第三个值表示该最大子方阵的行数。

C++代码

main.cpp

没用什么优化算法,暴力解题。

#include <iostream>
#include <vector>

using namespace std;

vector <int> findLargestBlock (const vector <vector <int> > &m,int n){
    int t = 1;
    int i = 0,j = 0,l = 0;
    int x = 0,y = 0;
    vector<int> result(3,0);

    for(l=n;l>=1;l--){ //矩阵维数,从最大开始
        for(i=0;i<=n-l;i++){
            for(j=0;j<=n-l;j++){
                t=1;
                for(x=i;x<i+l;x++){
                    for(y=j;y<j+l;y++){
                        if(m[x][y]!=1){    //不为1退出此轮循环
                            t=0;
                            break;
                        }
                    }
                    if(t==0) break;
                }
                if(t==1) break;
            }
            if(t==1) break;
        }
        if(t==1) break;
    }

    result[0] = i;
    result[1] = j;
    result[2] = l;

    return result;
}

int main() {

    int n;
    vector<vector <int> > m(100,vector<int>(100,0));
    cout << "Enter the number of rows for the matrix:";
    cin >> n;
    cout << "Enter the matrix row by row:" << endl;
    int numOfOne = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            cin >> m[i][j];
        }
    }
    vector<int> result =  findLargestBlock(m,n);

    cout << "横坐标:" << result[0] << " 纵坐标:" << result[1] << " 最大子方阵的行数:" << result[2] << endl;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容