脾气牛排序问题
前言:
**[小声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上有的测试用例会运行错误。