poj2038
来源:互联网 发布:java 时间格式 cst 编辑:程序博客网 时间:2024/05/16 06:37
题意:有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;}