Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
stdin/stdout | 5s | 8192K | 228 | 103 | Standard |
Arthur想要将手下的战士按照能力进行排名, 选择出得力的助手进行冒险. 他收集了很多人之间比武的胜负情况,如A战胜了B,B战胜了C等。他发现,这些胜负关系之间彼此互不矛盾,也就是不能出现C又战胜了A这种情况,但很多人之间并没有比武, 也就无法衡量谁更强。在这种情况下,Arthur想把所有可能的排行榜都列举出来,供他进一步研究。
Input:
本题目包括多个Case。每个Case的第一行有2个数字m,n. m<13,代表有多少个人物,每个人物使用一个大写字母表示。之后有n行, n<100, 每一行有2个字母X Y, 中间有一个减号, 表示X战胜过Y。可以假定输入没有重复.
Output:
对于每一个Case, 输出所有可能的排行榜序列, 每个序列占据一行, 各个序列之间按照字母升序排列. 每个Case后面有一个空行Sample Input:
3 2 A-B A-C 4 3 A-B C-A C-D
Sample Output:
ABC ACB CABD CADB CDAB
Problem Source: skywind
This problem is used for contest: 32
#include<iostream>
int pre[20][20],num[20];
bool flag[20];
char s[20];
int m,n;
void dfs(int step)
{
int i,j;
if(step>=m)
{
s[step]=0;
printf("%s/n",s);
return;
}
bool k=true;
for(i=0;i<m;i++)
{
if(!flag[i])
{
k=true;
for(j=0;j<num[i];j++) //来验证他的前面端点是不是全都被便利
if(!flag[pre[i][j]])
{
k=false;
break;
}
if(k) //若前面的端点全都已被便利,则拿来这个点
{
s[step]=i+'A';
flag[i]=true;
dfs(step+1);
flag[i]=false;
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(flag,false,sizeof(flag));
memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
{
scanf("%s",s);
pre[s[2]-'A'][num[s[2]-'A']]=s[0]-'A';
num[s[2]-'A']++;
}
dfs(0);
printf("/n");
}
return 0;
}