hdu 4068 福州网络赛

题目数据较小,直接枚举自己和敌人的所有全排列,暴力水之(讨论出做法后,队友写的)
View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int n;
int id1[10],id2[10];
struct node{
char s[25];
}p[10];

int map[10][10];
int cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}

void init()
{
for(int i=0;i<n;i++)
id2[i]=i;
}

int match()
{
int i,j;
i=j=0;
while(i<n&&j<n)
{
if(map[id1[i]][id2[j]])
i++;
else
j++;
}
if(i==n)
return 1;
else
return 0;
}

int main()
{
int T,cas=1,tot,flag;
int i,j,k,t;
char ch[25];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%s",p[i].s);
}
sort(p,p+n,cmp);
for(i=0;i<n;i++)
{
scanf("%d",&k);
for(j=0;j<k;j++)
{
scanf("%s",ch);
for(t=0;t<n;t++)
{
if(strcmp(p[t].s,ch)==0)
{
map[t][i]=1;
}
}
}
}
printf("Case %d: ",cas++);
tot=1;
for(i=0;i<n;i++)
{
id1[i]=id2[i]=i;
tot*=(i+1);
}
flag=1;
for(i=0;i<tot;i++)
{
init();
for(j=0;j<tot;j++)
{
if(match())
{
break;
}
next_permutation(id2,id2+n);
}
if(j==tot)
{
printf("Yes\n");
for(k=0;k<n-1;k++)
printf("%s ",p[id1[k]].s);
printf("%s\n",p[id1[k]].s);
flag=0;
break;
}
next_permutation(id1,id1+n);
}
if(flag)
printf("No\n");
}
return 0;
}

你可能感兴趣的:(HDU)