求最大0矩阵

#include<stdio.h>
#define M 5
#define N 5
//说明:矩阵的行列必须对应M,M的值
struct Node{//定义柱状数据结构体
int height;//柱状图的高度
int tag;//判断是否过顶
};
//取得单行最大值函数
int getDNMax(int DHArr[N]){
int max=0;
int i,j,k,m,n;
int s;//面积
int tag=0;//判断标签
Node d[N];
for(i=0;i<N;i++){ //初始化Node
d[i].height=DHArr[i];
d[i].tag=0;
}
//水平面逐渐上升
for(i=0;i<=M;i++){
tag=0;
for(j=0;j<N;j++){//初始化Tag标记为零
if(d[j].tag==0){
break;

}
   for(m=j;m<N-1;){//两个for循环依次从左向右识别同高矩阵的面积
for(n=m+1;n<N;){
while(d[n].tag==0&&n<=N-1){//若n未被标记则继续往前走(所谓标记及水平面是否过顶)
n++;
}
if(n==N){//n到头的情形
s=(n-m)*i;
if(s>max) max=s;
tag=1;
break;
}
else{//n未到头,m,n可以改变位置并继续识别的情形
s=(n-m)*i;
if(s>max) max=s;
while(d[n].tag==1){
n++;
}
if(d[n].tag==1){
m=n+1;
n=m+1;
}
else{
m=n;
n=m+1;
}
}
}
if(tag==1){//用于跳出双层循环
break;
}
}
for(k=0;k<N;k++){//过顶标记
if(i==d[k].height){
d[k].tag=1;
}
}
}
//算法限制最后一行数据无论多大都无法记录下来,所以加上了一条判断
if(d[N-1].height>max) max=d[N-1].height;
return max;//返回最大值
}
void main(){
int max[M];
int Max;
int log=0;
    int Arr[M][N]={{1,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{1,1,0,0,0},{1,0,0,0,0}};//给的数组
//============================
int ResArr[M][N];
int arr[N];
int i,j,k;
int n,m;
int deep;
//获取柱状图并组成数据数组
for(i=0;i<M;i++){
//求单行柱状式
//行不变,列变化求值
for(m=0;m<N;m++){
n=i;
deep=0;
while(Arr[n][m]==0&&n<M){
n++;//行向下深入
//记录深入程度
deep+=1;
}
arr[m]=deep;//将向下纵深的值存入数组
}
max[log]=getDNMax(arr);
log+=1;
}
//
Max=max[0];//求最大max值
for(n=1;n<M;n++){
if(max[n]>Max) Max=max[n];
}
printf("Max-LinYiJuZhenMainJi=[%d]\n",Max);

}

PS:M是行,N是列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值