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;
}



相关文章
|
12月前
|
机器学习/深度学习 人工智能 算法
C++/PTA 球队“食物链”
某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。
90 0
|
12月前
7-227 寻找大富翁
7-227 寻找大富翁
54 0
|
人工智能 算法 数据处理
英雄联盟胜负预测--简易肯德基上校
英雄联盟胜负预测--简易肯德基上校
英雄联盟胜负预测--简易肯德基上校
|
机器学习/深度学习 人工智能 算法
球队“食物链”
c++天梯赛算法题
|
算法 关系型数据库 定位技术
为什么订餐不会凉凉和牛顿发现万有引力有关
希望通过本次课题,与大家探讨订餐系统的技术难点及提出解决方案。
为什么订餐不会凉凉和牛顿发现万有引力有关