欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

18.小丑排序

程序员文章站 2022-06-01 12:47:47
...

【问题描述】

你在信天翁马戏团(是的,它是由一群小丑组成)从事管理工作,你刚刚写完一个程序的输出是将他们的姓名按长度为非递减的方式排列,名称列表(使每名至少只要它之前的)。然而,你的老板不喜欢这种输出方式,而是希望输出出现更对称,较短的字符串在顶部和底部,而较长的字符串在中间。他的规则是,每一对名称都是在该列表的相对的两端,并且在该组中的第一个名字总是在列表的顶部。比如在下面的第一个例子中,Bo和Pat是第一对,Jean和Kevin是第二对,等等。

【输入形式】

输入由1到多个字符串集合组成,最后一行为0表示输入结束,每个集合开始于一个整数n,表示该集合字符串的个数,接下来n行由n个字符串按长度非递减的方式排列,每个集合至少包含一个但不超过15个字符串,每个字符串不超过25个字符。

【输出形式】

对于每个集合,第一行输出"set-n", n从1开始,接下来的若干行对应输入每个集合重新排列的结果,如样例所示。

【样例输入】

7
Bo
Pat
Jean
Kevin
Claude
William
Marybeth
6
Jim
Ben
Zoe
Joey
Frederick
Annabelle
5
John
Bill
Fran
Stan
Cece
0

【样例输出】

set-1
Bo
Jean
Claude
Marybeth
William
Kevin
Pat
set-2
Jim
Zoe
Frederick
Annabelle
Joey
Ben
set-3
John
Fran
Cece
Stan
Bill
#include<bits/stdc++.h>
using namespace std;
struct team { //因为有对的概念存在,所以用结构体将各对存储起来
	string first;
	string second;
};
int main() {
	int n;
	int key=1;
	while(cin>>n&&n!=0) {
		string arr[n];
		for(int k=0; k<n; k++)
			cin>>arr[k];
		if(n%2==1) { //n为奇数,说明存在单独一个人且名字最长
			team steam[(n-1)/2];
			string str;
			str=arr[n-1];
			//	cout<<str<<endl;
			for(int i=0,j=1,ii=0; ii<n/2; ii++,i+=2,j+=2) {//将各对存入结构体中
				steam[ii].first=arr[i];
				steam[ii].second=arr[j];
			}
			for(int i=0,j=n-1; i<n,j>0; i++,j--) { //再反过来将结构体中的按照规则存入数组中
				if(i==(n-1)/2) {
					arr[i]=str;
					break;
				}
				arr[i]=steam[i].first;
				arr[j]=steam[i].second;
			}
			cout<<"set-"<<key<<endl;
			for(int s=0; s<n; s++)
				cout<<arr[s]<<endl;
			key++;
		}
		if(n%2==0) { //n为偶数,说明存在单独一个人且名字最长
			team steam[n/2];
			for(int i=0,j=1,ii=0; ii<n/2; ii++,i+=2,j+=2) {//将各对存入结构体中
				steam[ii].first=arr[i];
				steam[ii].second=arr[j];
			}
			for(int i=0,j=n-1; i<n,j>0; i++,j--) {//再反过来将结构体中的按照规则存入数组中
				arr[i]=steam[i].first;
				arr[j]=steam[i].second;
				if(i+1==j)break;
			}
			cout<<"set-"<<key<<endl;
			for(int s=0; s<n; s++)
				cout<<arr[s]<<endl;
			key++;
		}
	}
	return 0;
}