第五次上机
目录
前言
自己写的上机作业,可以用于参考
目前处于初步学习中,写的不好见谅
一、题目
二、解题
1.思路
我自己想的思路感觉特别复杂又臭又长
但是写出来了
总体上就是按照题目要求按部就班的把各个情况列出来?
我觉的应该有更简单更好的思路,但我懒得去找了
思路见下面代码注释
2.代码
代码如下(示例):
#include<stdio.h>
int main()
{
int m,n,a[100][100];
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);//输入一个二维数组
}
}
for(int e=0,b[50][3],t=0,i=0;i<m;i++)
//对二维数组a[][]每一行都进行以下处理
//首先判断该行是否都为0用e的值来区分,若e为0则该行全为0,输出-1 -1
{
for(int j=0;j<n;j++)
{
if(a[i][j]==1)
{
e=1;//用e的值来区分,若该行全为0则令e为0,否则令e为1
}
}
if(e==1)//e为1说明存在连续1序列
/*用一个二维数组b[][]记录每行中1有几段,每段中有几个1
和该序列的起始和结束位置 */
/*例如
b[0][0]=5 b[0][1]=0 b[0][2]=4
该行中的第一个连续1序列有5个1 起始位置为0 结束位置为4
b[1][0]=3 b[0][1]=6 b[0][2]=8
该行中的第2个连续1序列有3个1 起始位置为6 结束位置为8
*/
{
for(int c=0,d=0,j=0;j<n;j++)
//c定初值为0,用来记录该1的连续段中有几个1
//d定初值为0,用来记录被判断的数的前一个数字是0还是1
{
if(a[i][j]==1&&d==0)
//若前一个数为0,当前数为1则当前为连续1序列的起始位置
{
d=1;c=c+1;b[t][1]=j;//将其记录进b[t][1]
}
//以下同理,考虑各个情况
if(a[i][j]==1&&d==1)
{
d=1;c=c+1;
}
//前一个数为1,当前数为0,说明前一个数是连续1序列的结束位置
if(a[i][j]==0&&d==1)
{
d=0;b[t][2]=j-1;//其记录进b[t][2]
b[t][0]=c;//此时一个连续1序列结束,记录该连续1序列有几个1
t++;//t+1使该行下一个连续1序列的相关数据能记录进二维数组b[][]的下一行中
c=0;//由于一个连续1序列结束,所以c归零
}
if(a[i][j]==0&&d==0)
{
d=0;
}
//考虑到一行全是1的情况,那么最后一个被判断的数是且前一个数也是1
//此时也应该归为连续1序列结束
if(j==n-1&&a[i][j]==1)
{
d=0;b[t][2]=j;b[t][0]=c;c=c+1;t++;c=0;//同理
}
}
//找出每行连续1序列中最多1的那个连续1序列的数据
//因为b[][0]记录的是每个连续1序列中1的个数,所以通过循环找出最大的那个
for(int i=0;i<t;i++)
{
if(b[i][0]>b[0][0])
{
b[0][0]=b[i][0];
b[0][1]=b[i][1];
b[0][2]=b[i][2];
}
}
t=0;//对二维数组a[][]每行都应该有个二维数组b[][]进行记录,所以将t归零
printf("%d %d\n",b[0][1],b[0][2]);
}
else if(e==0)printf("-1 -1\n");//若一行全是0,输出-1 -1
e=0;
}
return 0;
}