西电上机题——P69-0-1矩阵

第五次上机

目录

第五次上机

前言

一、题目

二、解题

1.思路

2.代码


前言

自己写的上机作业,可以用于参考

目前处于初步学习中,写的不好见谅


一、题目

二、解题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值