题意:
有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;
}
poj2038
最新推荐文章于 2023-02-28 20:59:40 发布