题意: 有ABCDE 5个字母,找出它的全排列中的一种排列和输入的n个串中的相对位置不同的个数的和最小。 例如ABCDE和ACBDE,相对位置就BC不一样,即value=1; #include<stdio.h> #include<string.h> #include<stdlib.h> struct node { //记录全排列的结果。 char pox[110]; int num[10]; }num_a[121],num_b[121]; int vis[5]; int nu,d; char temp[5]; void DFS() { int i; if(d==5) { strcpy(num_a[nu].pox,temp); nu++; return ; } for(int i=0; i<5; i++) if(!vis[i]) { temp[d]=i+'A'; vis[i]=1; d++; DFS(); d--; vis[i]=0; } } int main() { int sum,i,j,k,p,q,n,ans; nu=d=0; DFS(); while(~scanf("%d",&n),n) { sum=0; for(i=0;i<n;i++) { scanf("%s",num_b[i].pox); } for(i=0; i<nu; i++)//转化。 for(k=0; k<5; k++) num_a[i].num[num_a[i].pox[k]-'A']=k; for(i=0; i<n; i++) for(k=0; k<5; k++) num_b[i].num[num_b[i].pox[k]-'A']=k; int max=99999999; int temp; ans=0; for(i=0; i<nu; i++) { sum = 0; for(k=0; k<n; k++) { temp=0; for(j=0; j<5; j++) for(p=j+1; p<5; p++) if((num_a[i].num[j]-num_a[i].num[p])*(num_b[k].num[j]-num_b[k].num[p])<0) temp++; sum += temp; } if(sum<max) { max=sum; ans=i; } } printf("%s is the median ranking with value %d.\n",num_a[ans].pox,max); } return 0; }