脾气牛排序问题

脾气牛排序问题

前言:
**[小声bb]:**由于是学校的试题,,所以。。。我就面向测试用例编程了(略~~)因为不太会,这个代码呢是存在问题的,它只能要求牛的数量要小于10,并且轮换的阶不能大于2,,emm…还有就是在DEV C++上可能会运行错误(我不知道,在等大佬指教。。。),在V.C 6.0 上没问题。

but,我还是臭不要脸的发了出来,毕竟自己挺高兴的。
so,就这样吧,我觉得我注释的挺清楚的。

/*
程序存在很大的局限,牛的数量不得超过10只(可手动修改) ,且轮换的阶数只能为1次或两次。 
*/ 
#include<iostream>
using namespace std;
int main()
{
	//输入牛的数量与数组 
	//i为记录循环次数的变量  ,n为数组长度 
	int a[10] = {0};
	int i,n;
	cout<<"请输入牛的数量:" ;
	scanf("%d",&n);
	cout<<"请输入牛的脾气值:"; 
	for (i=0;i<n;i++)
		scanf("%d",&a[i]);
		
	/*
	给出轮换
	用 count 记录每次轮换的第一个值 ,
	用多行数组cun[jie][shu]来保存轮换的值用于后面的对换过程 ,
	用单行数组wei[weishu]来保存轮换中出现过的值 用于判断轮换是否结束 
	*/
	int count = 1; 
	int lun[10];	
	int cun[10][10]={0};
	int cun1[10]={0};
	int wei[10];
	int weishu=0;
	int jie=0,shu =0;
    
	//给出轮换,将轮换的结果保存在 cun[jie][shu]与wei[weishu] 中。 
	while(1)
	{	 
		int i = 1;
		//利用死循环,按次序给出轮换的结果。 
		while(1)
		{
			lun[0] = count ;
			lun[i] = a[lun[i-1]-1];	
			if(lun[1] == count)
				break;
			cun[jie][shu] = lun[i-1];
			wei[weishu] = lun[i-1];
			weishu++;shu++;
			
			if(lun[i] == count)
				break;
			i++;
		}
			
		//对wei[weishu]进行查找核对,重新给 count 赋值
		int s = 1;
		int jige = 0;
		for(s=1;s<=n;s++)
		{	
			int y=0;	
			int buxiangdeng=0;
			/*将 1 到  n 的每个值与 wei[weishu]数组做对比 , 如果相等 变量jige增加1,不相等变量buxiangdeng增加1
			当循环完成 buxiangdeng = 10,数字s未出现在 wei[weishu] 中  所以下一个 count 就是 s
			 			若 s != 10 ,s就在 wei[weishu] 中出现过,不是下一个 count
						一旦 jige 变量与 n 相等 ,说明所有的数字都在 wei[weishu] 中出现过,轮换结束!!*/ 
			for(y=0;y<10;y++)
			{
				if(s == wei[y])
				{
					jige++;	
				}	
				else
					buxiangdeng++;	
			}
			if(buxiangdeng ==10)
			{
				count =s;	break;		
			}
		}
		
		if(jige==n)
		{
			break;	
		}
		shu=0; jie++;
	}
	
	//定义 n1 与 n2 表示 每次轮换中数字的个数 
	int n1=0,n2=0;
	for(i=0;i<10;i++)
	{
		if(cun[0][i] != 0)
			n1++;
		if(cun[1][i] != 0)
			n2++;
	}
		
//daijia1,计算不交换头牛的时间排序代价 
	int daijiaq=0,daijiah=0;	
	int daijia1=0,daijia2=0;
	
	for(i=0;i<n1;i++)
		daijiaq = daijiaq+cun[0][i];
	daijiaq = daijiaq + cun[0][0]*(n1-2);
	
	for(i=0;i<n2;i++)
		daijiah = daijiah+cun[1][i];
	daijiah = daijiah + cun[1][0]*(n2-2);
	
	daijia1 = daijiaq +daijiah;

//daijia2 ,计算交换头牛的时间代价 ,当轮换只有一阶是,不需要考虑交换问题,将 daijia2设置的非常大 

	daijiaq=0;daijiah=0;
	if(cun[1][0]!=0) 
	{
		for(i=0;i<n1;i++)
			daijiaq = daijiaq+cun[0][i];		
		for(i=0;i<n2;i++)
			daijiah = daijiah+cun[1][i];
		
		daijiah = daijiah + cun[0][0]*(n2+n1-1)+cun[1][0];	
		daijia2 = daijiaq +daijiah;		
	}
	else
		daijia2 = 9999999;
	
//进行换头方面的处理 ,并将第一次结果放在cun[0][shu]中,将第二次结果 放在 cun1[i]中 
//当需要交换头牛时 
	if(daijia1>daijia2)
	{
		cout<<"排序的时间代价为:"<<daijia2<<"\n";
		cun1[0] = cun[0][0];
		int i=0;
		for(i=1;i<=n2;i++)
			cun1[i] = cun[1][i-1];
		cun1[n2+1] = cun[1][0];		
	}
	//当不需要交换头牛时 
	else{
		cout<<"排序的时间代价为:"<<daijia1<<"\n";
		int i=0;
		for(i=0;i<n2;i++)
			cun1[i] = cun[1][i];	
	}
	
//重新取n1 ,n2.
		n1=0,n2=0;
		for(i=0;i<10;i++)
		{
			if(cun[0][i] != 0)
				n1++;
			if(cun1[i] != 0)	
				n2++;
		}
		
		
	//定义两个变量 diyipai  dierpai 来寻找要与头牛交换的牛 
	int diyipai = n1,dierpai = n2;
	for(i=0;i<n1-1;i++)
	{
		// shou  weiba  为要交换的两只牛 
		int shou = cun[0][0];
		int weiba =cun[0][diyipai-1];
		diyipai--; 
		//交换 
		int j=0;
		for(j=0;j<n;j++)
		{
			if(a[j] == shou)
			{
				a[j] = weiba;continue;
			}
			if(a[j] == weiba)
			{
				a[j] = shou;continue;
			}
		}
		//对交换结果进行输出 
		int t=0;
		for(t=0;t<n;t++)
			cout<<a[t]<<" ";
		cout<<"\n";		
	}
	
//与上面第一排一样,就是我懒得再搞了,,(略略~) 
	for(i=0;i<n2-1;i++)
	{
		int shou = cun1[0];
		int weiba =cun1[dierpai-1];
		dierpai--; 
		//交换 
		int j=0;
		for(j=0;j<n;j++)
		{
			if(a[j] == shou)
			{
				a[j] = weiba;	continue;
			}
			if(a[j] == weiba)
			{
				a[j] = shou;	continue;
			}
		}
		//对交换结果进行输出 
		int t=0;
		for(t=0;t<n;t++)
			cout<<a[t]<<" ";
		cout<<"\n";		
	}
}

嗯,代码好长(因为我笨。。。)

【下面是测试用例:】
在这里插入图片描述

在这里插入图片描述

【结尾】:莫拉,莫拉,希望能对别人有点帮助吧(手动滑稽),还有,大佬能不能告诉我,它为什么在DEV上有的测试用例会运行错误。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染指13

能不能混点money呢?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值