南阳ACM8-一种排序

/*
一种排序
时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽
都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序
2.对于编号相等的长方形,按照长方形的长排序;
3.如果编号和长都相同,按照长方形的宽排序;
4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;
输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
样例输出
1 1 1
1 2 1
1 2 2
2 1 1
2 2 1
*/

//基本思路是每输入一个长方形的数据就将它与前面的长方形进行比较,如果是相同则将此数据忽略

//否则查询该长方形应插入到排好序的序列中的位置,最后移位进行插入

//最近常到南阳理工的ACM网站去A题了,虽然做的题大多都不是很难的,但每当做完一道题,心里都有一种说不出的愉悦。

//程序本身应该也不难,应该是自己的方法选得不对才导致程序写得这么难看,改了大半天,好在最后还是AC了,还是挺开心的

//程序中还多处用到了goto,,没办法呀,想从多重嵌套的for循环中一下子跳出来,还是用goto最省事了。

//网上应该有很多写得更好的代码,我等下也去看看别人写的。


#include <iostream>
using namespace std;

const int M = 1000;

int main()
{
// freopen("1.txt", "r", stdin);
int n, m, i, j;
int flags;//用来标记应插入的位置
int a[M][3]; //用来存放排好序的长方形数据
int number, length, width;//暂存长方形数据

cin>>n;
while(n--)
{
int temp, mask;
mask = 1; //用来记录存放的长方形个数
cin>>m;
flags = 0; 
cin>>a[0][0]>>a[0][1]>>a[0][2];
if (a[0][1] < a[0][2])
{
temp = a[0][1];
a[0][1] = a[0][2];
a[0][2] = temp;
}
for (i = 1; i < m; i++)
{
cin>>number>>length>>width;
if (length < width)//将长,宽中的较大的数存放到变量length中,软小的数存放到变量width中
{
temp = length;
length = width;
width = temp;

}

//下面查找新输入的长方形信息应该插入的正确位置

for (j = mask-1; j >= 0; j--)
{
if (number == a[j][0])
{
for (; j >= 0; j--)
{
if (length == a[j][1])
{
for (; j >= 0; j--)
{
if (width == a[j][2])
{
goto lop;
}
else if((width > a[j][2] && length == a[j][1] && number == a[j][0])
|| (length != a[j][1]) || (number != a[j][0]))
{
flags = j;
goto loop;
}
}
if (j == -1)
goto loop;
}
else if((length > a[j][1] && number == a[j][0]) || (number != a[j][0]))
{
flags = j;
goto loop;
}
}
if (j == -1)
goto loop;
}
else if (number > a[j][0])
{
flags = j;
goto loop;
}
}
loop:
if (j == -1) //如果插入的位置为最前
{
for (j = mask-1; j >= 0; j--)
{
a[j+1][0] = a[j][0];
a[j+1][1] = a[j][1];
a[j+1][2] = a[j][2];
}
a[0][0] = number;
a[0][1] = length;
a[0][2] = width;
mask++;
}
else
{
for (j = mask-1; j > flags; j--)
{
a[j+1][0] = a[j][0];
a[j+1][1] = a[j][1];
a[j+1][2] = a[j][2];
}
a[j+1][0] = number;
a[j+1][1] = length;
a[j+1][2] = width;
mask++;
}
lop: ;
}

for (i = 0; i < mask; i++)
{
cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<endl;
}
}
return 0;

}


作者:http://blog.csdn.net/lp310018931

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值