HDU-4068-SanguoSHA

HDU-4068-SanguoSHA

http://acm.hdu.edu.cn/showproblem.php?pid=4068

字符串模拟,枚举自己和对手的牌的全排列即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int map[10][10];
char str[10][25];
int a[10],b[10];
int n,flag;
int check(int a[10],int b[10])
{
	int num1=1,num2=1;
	while(num1<=n&&num2<=n)
	{
		if(map[b[num2]][a[num1]])
		num1++;
		else
		num2++;
	}
	if(num2>num1)
	return 1;
	return 0;
}
int main()
{
	int k,t,i,tt,j;
	char s[25];
	scanf("%d",&t);
	for(k=1;k<=t;k++)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		scanf("%s",str[i]);
		memset(map,0,sizeof(map));
		for(i=1;i<=n;i++)
		{
			scanf("%d",&tt);
			while(tt--)
			{
				scanf("%s",s);
				for(j=1;j<=n;j++)
				if(strcmp(s,str[j])==0)
				{
					map[i][j]=1;
					break;
				}
			}
		}
		for(i=1;i<=n;i++)
		a[i]=i;
		do
		{
			flag=1;
			for(i=1;i<=n;i++)
			b[i]=i;
			do
			{
				if(!check(a,b))
				{
					flag=0;
					break;
				}
			}while(next_permutation(b+1,b+n+1));
			if(flag)
			break;
		}while(next_permutation(a+1,a+n+1));
		printf("Case %d: ",k);
		if(flag==0)
		printf("No\n");
		else
		{
			printf("Yes\n");
			for(i=1;i<=n;i++)
			{
				if(i==n)
				printf("%s\n",str[a[i]]);
				else
				printf("%s ",str[a[i]]);
			}
		}
	}
	return 0;
}



你可能感兴趣的:(HDU-4068-SanguoSHA)