大连海事大学/C语言程序设计实践小学期/海大小王罗汉塔问题/C语言

海大同学小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到,马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。

输入描述:

首先一个正整数N,表示人员个数。之后N行,每行三个数,分别对应马戏团员编号,体重和身高。

输出描述:

正整数m,表示罗汉塔的高度。

好的学渣没有屏障,好的互联网不要搞信息差
c语言程序设计实践小学期不同老师要求不一样,不同班级题目不一样。我当时小学期任务是独自处理完成三道题目,现为其一——罗汉塔问题。

代码部分借鉴网络,部分个人书写,已标好备注。
//残存部分废弃代码,但已被注释。

代码可优化的地方,1.功能函数模块化 2.减少全局变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//对于本题的理解是,身高体重相等可以叠罗汉,体重不等(满足X层比X+1层重)身高等可以叠罗汉,身高体重都满足条件可以叠罗汉
//是两个维度严格递增问题
//且每层罗汉只有一人
//以此理解编写的程序
//程序编写过程中查阅了最长递增子序列,一维、二维动态数组定义,局部冒泡法等资料
//并无抄袭,根据自己的想法进行的程序编写
//水平太菜,没办法做到模块化,因此全部功能都包含在main函数。
//定义了很多全局变量,如下
int N,i,j,t,k,max;//静态指针、struct结构体、全局变量等可返回多个值


//不知道为什么有些变量在主函数里面定义会不断报错,找不出原因,最后致使定义了超级多的全局变量




int main()
{
	int **p,*list;
	scanf("%d",&N);//输入行数
	if(N<=0)return -1;//非法输入将立刻终止程序,此处还可以进行改进,换成循环,但这里不再处理
	list=(int *)malloc(N*sizeof(int));
	for(i=0;i<N;i++)
	{
		list[i]=0;
	}//创建一个和p同等长度的一维数组,并初始化
	p=(int **)malloc(N*sizeof(int*));//数组p的每个元素都指向int类型指针的指针,每个指针指向一行,共N行
	for(i=0;i<N;i++)
	{
		p[i]=malloc(sizeof(int)*3);//为每行申请数据空间
	}
	for(i=0;i<N;i++)
	{
		scanf("%d%d%d",&p[i][j],&p[i][j+1],&p[i][j+2]);//输入数据
	}
	//对身高的冒泡排序,让小的数据上浮
	for (k=0; k<N-1;k++)//排N-1次
	{
		for (i=0; i<N-1-k;i++)//每一轮比较N-1-k次
		{
			if (p[i+1][2]<p[i][2])
			{
				for (j=0;j<3;j++)//整行元素交换
				{
					t=p[i+1][j];
					p[i+1][j]=p[i][j];
					p[i][j]=t;
				}
			}
		}
	}
	for(i=0;i<N;i++)
	{
		for(j=0;j<3;j++)
		{
			printf("%d",p[i][j]);
			printf("\n");
		}
	}//检查数组是否排序

	//身高相同排序——局部冒泡排序
	for(i=0;i<N-1;i++)
	{
		if (p[i+1][2]==p[i][2])
		{
			goto sort;
		}
sort:
			if (p[i+1][1]>p[i][1])
			{
				for(j=0;j<3;j++)
				{
					t=p[i+1][j];
					p[i+1][j]=p[i][j];
					p[i][j]=t;
				}
			}

			for(i=i+1;i<N-1;i++)
			{
				if (p[i+1][2]==p[i][2])
				{
					goto sort;
				}
				if (i=N)break;
			}
	}
	for(i=0;i<N;i++)
	{
		int j=0;
		printf("%d%d%d",p[i][j],p[i][j+1],p[i][j+2]);
		printf("\n");
	}//检查数组是否排序

	list[0]=1;

	for(i=0;i<N;i++)
	{
		max=0;
		for(j=0;j<i;j++)
			if((p[i][1]>p[j][1])&&(max<list[j]))
			{
				max=list[j];
			}
			list[i]=max+1;
	}
	for(i=0;i<N;i++)
	{
		printf("%d",list[i]);
	}

	max=0;

	for(i=0;i<N;i++)
	{
		if(list[i]>list[max])
		{
			max=i;
		}
	}
	printf("最高罗汉塔层数为:%d",list[max]);

/*for (i=0;i<N;i++)//A:"以体重最大者为底层,进行遍历计数;再以体重次之者为底层,进行遍历计数。以此类推。"
 {
  int h=0;
  int m=1;//每次A循环开始,都会将m值重新初始化为1
  for (k=1;k<N-1;k++)//B:此为以第i层为底层时,罗汉塔只能有1层时的判定
  {
   if (p[i+k][2]<=p[i][2])
   {
    h=h+1;
    printf("罗汉塔层数大于一");
    break;
   }
   while (p[i+k][2]>p[i][2])
   {
    continue;//当不存在p[i+k][2]<=p[i][2]时,while循环被打破,进行下一轮D循环
   }

  }
  if (h=0)continue;//体重已经排完序,下面排除身高顺序不符合的
 }废案*/

/*SORT:
   for(k=0;k<N;k++)
   {
    if(p[i+k][2]<=p[i][2])//错误尝试,大概率不是最优解
    {
     m=m+1;
     i=i+k;
     goto SORT;
    }*/

	for(i=0;i<N;i++)
		free(p[i]);
	free(p);//释放内存
	free(list);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值