练习:0-1矩阵

该博客主要讨论如何在给定的0-1矩阵中找到每行最长的连续1序列。输入包括矩阵的行数和列数,以及矩阵的元素。算法通过比较当前和过去的状态更新最长序列的起始和结束位置,并在遇到0时重置计数器。输出为每行最长连续1序列的起始和结束位置,若无1则输出-1。提供的C语言代码实现了这个功能。
摘要由CSDN通过智能技术生成

标题    
0-1矩阵

问题描述    
查找一个只包含0和1的矩阵中每行最长的连续1序列。

输入说明    
输入第一行为两个整数m和n(0<=m,n<=100)表示二维数组行数和列数,其后为m行数据,每行n个整数(0或1),输入数据中不会出现同一行有两个最长1序列的情况。

输出说明    
找出每一行最长的连续1序列,输出其起始位置(从0开始计算)和结束位置(从0开始计算),如果这一行没有1则输出两个-1,然后换行。

输入样例    
5 6
1 0 0 1 1 0
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 0 1 1
0 0 1 1 0 0

输出样例    
3 4
-1 -1
0 5
0 2
2 3
————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————

1.因为题目要求是分开比较,所以上一行比较完所使用的变量,若在下一行使用时,有的则必须重置(在内循环前重新赋值)(c,cc)有的不需要(但也可以重置)(如a,aa,b,bb,)

2.每一行的比较与从左到右的先后顺序有关,且可以抽象为是过去与现在的比较。(c与cc,c表示现在,cc表示过去。因为最开始没有过去,所以需要给cc赋一个值合适的初值,即为0.与此同时c也要有一个合适的初值来反映其具有的实际意义)

3.将实际情况分为两种(一种是当前项arr[i]][j]==1的情况,另一种为当前项arr[i]][j]==0的情况)
当前项为1时:则需给用来记录长度的变量c加1,对当前的a,b进行赋新值。通过用两个变量做差的方式使得a的值达到不变的效果。即使得起始位置不会因j++而改变,b的值则需跟着j的变化而变化。
    还需要考虑的是与过去的比较问题。所以再给a,b,c赋新值后,需要让c与cc进行判断。若c大于cc则说明过去的连续一序列一定不是最长的,则需要用当前的值代替过去的值(即对aa,bb,cc进行赋值,        以此来达到,对数据的保存的效果。)(当前的值a,b,c相当于是对数据的暂存)
当前项为0时:对c恢复为零即可,使得下一次遇到1时依然可以用来记录长度且所具有的意义(c的值代表的含义)与最初相同。

4.通过对cc与0的比较,得出这一行是否全为零。cc==0,即表明c==0恒成立,即c没有自增过,即arr[i]][j]==1始终不满足。

————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————

#include<stdio.h>
int main()
{
    int n,m,i,j,a,aa,b,bb,c,cc;
    scanf("%d %d",&n,&m);
    int arr[n][m];
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0;i<n;i++)
    {
        c=0;cc=0;
        for(j=0;j<m;j++)
        {
            if(arr[i][j]==1)
            {
                c++;
                a=j-c+1;b=j;
                if(c>cc)
                {
                    aa=a;bb=b;cc=c;
                }
                
            }
            else
            {
                c=0;
            }
        
        }
        if(cc==0)
        {
            aa=-1;bb=-1;
        }
        printf("%d %d\n",aa,bb);
    
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值