7-15 球队“食物链”

简介: 7-15 球队“食物链” 某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。

7-15 球队“食物链”


某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。


联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{

T 1  T 2  ⋯ T N  },满足:球队T 1  战胜过球队T 2  ,球队T 2 战胜过球队T 3  ,⋯,球队T (N−1)  战胜过球队T N  ,球队T N  战胜过球队T 1  。


现在主席请你从联赛结果中找出“食物链”。若存在多条“食物链”,请找出字典序最小的。


注:排列{ a 1  a 2  ⋯ a N  }在字典序上小于排列{ b 1  b 2  ⋯ b N },当且仅当存在整数K(1≤K≤N),满足:a K  


输入格式:


输入第一行给出一个整数N(2≤N≤20),为参赛球队数。随后N行,每行N个字符,给出了N×N的联赛结果表,其中第i行第j列的字符为球队i在主场对阵球队j的比赛结果:W表示球队i战胜球队j,L表示球队i负于球队j,D表示两队打平,-表示无效(当i=j时)。输入中无多余空格。


输出格式: 按题目要求找到“食物链”T 1  T 2  ⋯ T N ,将这N个数依次输出在一行上,数字间以1个空格分隔,行的首尾不得有多余空格。若不存在“食物链”,输出“No Solution”。


输入样例1:


5


-LWDW


W-LDW


WW-LW


DWW-W


DDLW-


输出样例1:


1 3 5 4 2


输入样例2:


5


-WDDW


D-DWL


DD-DW


DDW-D


DDDD-


输出样例2:


No Solution

//注意:i战胜j可以是st[i][j]='W'||st[j][i]='L';
#include<stdio.h>
#include<string.h>
int n;
char st[25][25];
int a[25];
int ans;
int l;
int visit[25];
int u;
void dfs(int v)
{
  int i,j;
  if(ans==1)
  return ;
  if(l==n)
  {
    if(st[v][u]=='W'||st[u][v]=='L')
    {
      for(j=0;j<n-1;j++)
      printf("%d ",a[j]+1);
      printf("%d\n",a[n-1]+1);
      ans=1;
      return ;
    }
  }
  for(i=0;i<n;i++)
  {
    if(ans==1)
    return ;
    int tag=0;
    //优化,因为是一个环,若该点没有战胜0,则就没有必要对该点判断下去 
    for(j=1;j<n;j++)
    {
      if(!visit[j]&&st[j][0]=='W'||st[0][j]=='L')
      {
        tag=1;
        break;
      }
    }
    if(tag==0)
    return ;
    if(!visit[i]&&(st[v][i]=='W'||st[i][v]=='L'))
    {
      visit[i]=1;
      a[l]=i;
      l++;
      dfs(i);
        visit[i]=0;
        l--;
    } 
  }
}
int main()
{
  int i,j;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  scanf("%s",st[i]);
  int tag=0;
  //优化,因为是一个环,所以若存在一个食物链,就直接判断从0开始是否可以即可 
  for(i=1;i<n;i++)
  {
    if(st[i][0]=='W'||st[0][i]=='L')
    {
      tag=1;
      break;
    }
  }
  if(tag==0)
  {
    printf("No Solution\n");
    return 0;
  }
  memset(visit,0,sizeof(visit));
    ans=0;
  l=0;
  u=0;
  a[l]=0;
  l++;
  visit[0]=1;
  dfs(0);
  if(ans==0)
  printf("No Solution\n");
  return 0;
}



相关文章
|
7月前
1014 福尔摩斯的约会
1014 福尔摩斯的约会
39 0
|
机器学习/深度学习 人工智能 算法
C++/PTA 球队“食物链”
某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。
127 0
小猴打架
题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友。每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友。经过N-1次打架之后,整个森林的小猴都会成为好朋友。 现在的问题是,总共有多少种不同的打架过程。
147 0
小猴打架
|
机器学习/深度学习 人工智能 算法
球队“食物链”
c++天梯赛算法题
|
安全 开发者
最酷的黑客马拉松地点?30000英尺的高空
说到黑客马拉松,你很容易想起这些:拿着不放的手机,随处开着放在桌上的笔记本,当然还有互联网连接。但是英国航空公司”不接地创新实验室“中的开发者可没有这些东西,他们在空中进行了11个小时的黑客马拉松。
194 0
最酷的黑客马拉松地点?30000英尺的高空
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩
我们比较了名媛、金融精英、互联网新贵们在京沪的生存状况,一一决出了胜负——上海南京西路的名媛过得更精致,但北京的金融精英们才是真的壕,互联网新贵们在北京更可以事业生活双丰收。
2219 0
|
大数据
不想去健身房的我,最后被贝叶斯分析说服了...
可能经常你会听到一些很主观的评价比如“你太瘦了”或者“你怎么那么高”,但这里瘦或者高都是基于评价者的主观判断和视觉记忆做出的评述,并没有严格的参照。
1218 0

热门文章

最新文章