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



相关文章
|
6月前
国王的魔镜
国王的魔镜
53 0
|
算法 C语言 C++
【数论】蚂蚁感冒、饮料换购、买不到的数目
长 100 厘米的细长直杆子上有 n只蚂蚁。
84 0
|
机器学习/深度学习 人工智能 算法
C++/PTA 球队“食物链”
某国的足球联赛中有N支参赛球队,编号从1至N。联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场。
125 0
7-227 寻找大富翁
7-227 寻找大富翁
63 0
|
算法
算法:奶牛慢跑
题目: 奶牛们又出去锻炼蹄子去了! 有 N 头奶牛在无限长的单行道上慢跑。 每头奶牛在跑道上开始奔跑的位置都不相同,一些奶牛的奔跑速度也可能不同。
111 0
|
机器学习/深度学习 人工智能 算法
球队“食物链”
c++天梯赛算法题
|
网络架构
运动会-组合数学
题目描述 在一次运会上,有一个比赛项目,共有N个人参加比赛,要将这N个人分组,每组人数不少于K个,问有多少种分组方式? 比如有16个运动员,每组人数不少于5个,共有6种分组方式: (1) 分一组,为16人; (2) 分二组,分别为11人、5人; (3) 分二组,分别为10人、6人; (4) 分二组,分别为9人、7人; (5) 分二组,分别为8人、8人; (6) 分三组,分别为6人、5人、5人。 注意:6+5+5,5+6+5,5+5+6为同一种,只算一种分组方式; 输入 输入共一行为两个整数N, K。表示有N个运动员分组,每组不少于K个人(1 ≤ K ≤ N ≤ 500)。
179 0
|
算法 关系型数据库 定位技术
为什么订餐不会凉凉和牛顿发现万有引力有关
希望通过本次课题,与大家探讨订餐系统的技术难点及提出解决方案。
为什么订餐不会凉凉和牛顿发现万有引力有关
我的女儿二三事(八)
今天周五了,思来想去,好久没有写点女儿的故事了。索性再来一篇。 - 孩子对爸的态度 - 我如果平时上班早一些,她要么还在睡觉,要不就在玩自己的,在我出门前抬头看看我,冲我摆摆手说,”爸爸再见“,然后继续玩。
996 0