单位矩阵
题目描述
X是一个灰常讨厌数学的学生,所以想请你帮他解决一个简单的关于矩阵的问题。给定一个只有0和1构成的大小为M*N的矩阵,在其中找到最大的子单位矩阵。单位矩阵是指主对角线上元素全部为1,其余元素全部为0的方阵。主对角线是指左上角到右下角方向的对角线。数据规模(1<=M,N<=1000)。
输入格式
多组数据输入,每组第一行输入M和N,空格分开,接下来M行输入矩阵数据,每行N个元素,输入以文件尾(EOF)结束。
输出格式
对于每组数据,输出该矩阵中最大子单位矩阵的行数,每次输出独占一行。
输入样例 复制
5 6
010000
010001
010000
001000
100111
2 5
01000
00110
输出样例 复制
3
2
解题思路:
看见这个题的时候 感觉应该用深搜…但是没写出来
后来就完全凭感觉写的 提交2遍ac
我的思路就是 遍历这个二维字符数组 当遇到‘1’的时候就进入sou函数来找从当前位置开始 递归 往右下方(对角线方向)找看有几个‘1’ 每次遇到‘1’就cnt++,确定下从当前i,j点能扩大多少(先不管别的位置是否满足都是‘0’这个条件 我设置这个函数的目的就是减少循环次数 因为如果不先确定下大概范围 直接for循环开始找 我个人觉得比较耗时)
当递归函数返回到主函数后 我再用while(cnt–)来判断 当前对角线上的1所在的行和列除了他本身 剩下的是否都是‘0’ 一步步来缩小范围 当当前点不满足条件时 我直接flag 跳出
循环此操作 每次都用max()函数来 挑选最大值 最后就是该矩阵中最大子矩阵的行数
上AC代码!:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
char p[1005][1005];
int m,n,cnt;
//能从1这个点扩大几层
int sou(int x , int y){
//cout<<"此时在sou函数中"<<endl;
//在不越界的情况
if(x+