题目描述
给定一个元素为0或1的方阵,编写一个程序,找出其中最大的子方阵,使得该子方阵的元素都是1。程序先提示用户输入矩阵的行数,然后提示用户输入矩阵内容,打印输出最大子方阵的第一个元素的位置以及最大子方阵的行数。假定矩阵最多有100行。下面是样例运行:
1 2 3 4 5 6 7 8
| 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 findLargestBlock (const vector > & m)
返回值是一个向量,包含3个值,前两个值代表该最大子方阵第一个元素的行标和列标,第三个值表示该最大子方阵的行数。
C++代码
main.cpp
没用什么优化算法,暴力解题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #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; }
|