标题
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;
}