题目是:
Description
有N行数据,每行有若干数量不等的整数组成。现在要对这N行数据排序。排序原则为:首先比较行中的第一个数的值,将第一个数大的行排在前面;若第一个数相等的话,则按照第二个数的值排序(若某行没有第二个数,则该行排在后面);若第二个数还是相等的话,则比较第三个数,依次类推。
例如:
14 38 11 89
27 34
27 12 34
27
92 2 3 1
17 2
排序的结果为:
92 2 3 1
27 34
27 12 34
27
17 2
14 38 11 89
Input
第1行:整数T(1≤T≤10)为问题数
第2行:第一个问题的整数N(1≤N≤1000)
第3 ∽ N+2行:第一个问题的每行的数据ai和表示行结束的标志-1, 1≤数据个数≤50。0≤ai≤10^9, 数据之间由一个空格分隔。
后面是第2 ∽ T个问题的数据。格式与第一个问题相同。
Output
对于每个问题,输出排序后的结果。
格式为:每行输出一行数据,数据之间有一个空格。
Sample Input
2
6
14 38 11 89 -1
27 34 -1
27 12 34 -1
27 -1
92 2 3 1 -1
17 2 -1
1
1 -1
Sample Output
92 2 3 1
27 34
27 12 34
27
17 2
14 38 11 89
1
我是根据这种思路写的:
每行不足的补-2,直至长度一样,即
14 38 11 89
27 34 -2 -2
27 12 34 -2
27 -2 -2 -2
92 2 3 1
17 2 -2 -2
然后从最后一列开始排序,排完了再排下一列
第四列排序:
14 38 11 89
92 2 3 1
27 34 -2 -2
27 12 34 -2
27 -2 -2 -2
17 2 -2 -2
第三列排序:
27 12 34 -2
14 38 11 89
92 2 3 1
27 34 -2 -2
27 -2 -2 -2
17 2 -2 -2
第二列排序:
14 38 11 89
27 34 -2 -2
27 12 34 -2
92 2 3 1
17 2 -2 -2
27 -2 -2 -2
第一列排序:
92 2 3 1
27 34 -2 -2
27 12 34 -2
27 -2 -2 -2
17 2 -2 -2
14 38 11 89
#include<stdio.h>
#include<stdlib.h>
struct su{
long s[51];
}ss[1000];
int main(){
int t,n,i,j,max,k;
struct su temp;
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<50;j++)
ss[i].s[j]=-2;
max=0;
for(i=0;i<n;i++){//输入
j=1;
while(ss[i].s[j-1]!=-1){
scanf("%ld",&ss[i].s[j]);
j++;
}
if(j>max)//max保留列最大
max=j;
}
for(j=max-1;j>=1;j--){
for(i=0;i<n;i++){//从最后一列对每行的数进行冒泡排序
for(k=0;k<n-i-1;k++){
if(ss[k].s[j]<ss[k+1].s[j]){
temp=ss[k];
ss[k]=ss[k+1];
ss[k+1]=temp;
}
}
}
}
for(i=0;i<n;i++){//输出
for(j=1;j<max-1;j++){
if((ss[i].s[j]!=-1)&&(ss[i].s[j]!=-2))
printf("%ld",ss[i].s[j]);
if(j!=max-2)
printf(" ");
}
printf("\n");
}
}
}
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。