题意记不大清楚了,很久之前做的。只大概记得是用全排列搜索将所有的排列组合打表写在一个二维数组里,然后再根据题目要求找出最佳的一种组合。
#include <stdio.h>
#include <string.h>
char per[130][8];
int n=0;
const int size = 5;
// 全排列函数,可以直接使用STL中的next_permutation代替,所有组合情况写在数组per中
void perm(int* num, int i) {
int j, k, tmp;
if(i < size) {
for(j = i; j < size; j++) {
tmp = num[j];
for(k = j; k > i; k--)
num[k] = num[k-1];
num[i] = tmp;
perm(num, i+1);
for(k = i; k < j; k++)
num[k] = num[k+1];
num[j] = tmp;
}
}
else {
for(j = 0; j < size; j++)
per[n][j]=num[j]+'A';
per[n][j]='\0';
n++;
}
}
int search( char a, char *s ) {
int i;
for ( i=0;i<size;i++ ) {
if ( s[i]==a )
break;
}
return i;
}
int main()
{
int i,t,j,l,k;
char data[140][8];
int sum[140];
int num[5]={0,1,2,3,4};
int min1,ch1,ch2;
char temp[8];
perm(num,0);
/* for ( i=0;i<n;i++ ) {
for ( j=0;j<n;j++ ) {
if ( strcmp(per[i],per[j])<0 ) {
strcpy(temp,per[i]);
strcpy(per[i],per[j]);
strcpy(per[j],temp);
}
}
}*/
scanf( "%d",&t );
while ( t!=0 ) {
for ( i=0;i<t;i++ )
scanf( "%s",&data[i] );
if ( t==1 ) {
printf( "%s is the median ranking with value 0.\n", data[0] );
}
else {
for ( i=0;i<n;i++ ) {
sum[i]=0;
for ( k=0;k<t;k++ ) {
for ( j=0;j<size;j++ ) {
ch1=search(data[k][j], per[i] );
for ( l=j+1;l<size;l++ ) {
ch2=search(data[k][l],per[i] );
if ( ch1>ch2 )
sum[i]++;
}
}
}
}
min1=sum[0];
for ( i=0;i<n;i++ ) {
if ( sum[i]<min1 )
min1=sum[i];
}
for ( i=0;i<n;i++ ) {
if ( sum[i]==min1 ) {
printf( "%s is the median ranking with value %d.\n", per[i], sum[i] );
break;
}
}
}
scanf( "%d",&t );
}
return 0;
}