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;}