本人是西电在读大一新生,偶然得知CSDN是一个程序员的交流平台,希望加入这个大家庭,并且记录自己的编程之路。 标题 0-1矩阵 类别 数组 时间限制 2S 内存限制 1000Kb 问题描述 查找一个只包含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
下面附上代码
#include<stdio.h>
int main(void)
{
int N[100][100]={0};
int i=0,j=0;
int m,n;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&N[i][j]);
}
}
for(i=0;i<m;i++)
{
int max=0,count=0,location=0,sign=0;
for(j=0;j<n;j++)
{
if(N[i][j]==1)
{
count++;
sign=1;
if(j+1<n)//不是最后一个元素
{
if(N[i][j+1]==0)//不是最后一个元素且下一个元素是0
{
max=count;
location=j;
count=0;
}
if(N[i][j+1])continue;
}
else if(j+1==n)
{
if(count>max)
{
max=count;
location=j;
count=0;
}
}
}
}
if(sign)printf("%d %d\n",location-max+1,location);
else
{
printf("-1 -1\n");
}
}
return 0;
}
算法实现:其中包含了连续性判断,以及最大长度判断。
因此,须定义max和location
分情况进行讨论
当N[i][j+1]不是该序列的最后一个元素时,当其为零,比较max和count 当count>max时,进行相应的赋值
当N[i][j+1]时该序列的最后一个元素时进行max和count的比较,再进行相应的赋值
本题的关键是讨论下一个是否为0和是否为最后一个数。