zoukankan      html  css  js  c++  java
  • L3-015. 球队“食物链”(dfs)

    L3-015. 球队“食物链”

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

    联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1 T2 ... TN },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,……,球队T(N-1)战胜过球队TN,球队TN战胜过球队T1

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

    注:排列{ a1 a2 ...aN }在字典序上小于排列{ b1 b2 ... bN },当且仅当存在整数K(1 <= K <= N),满足:aK < bK且对于任意小于K的正整数i,ai=bi

    输入格式:

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

    输出格式:

    按题目要求找到“食物链”T1 T2 ... TN,将这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


    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    int mp[25][25];
    bool vis[25];
    int n;
    int ans[25];
    bool flag;
    void dfs(int k,int fa)
    {
      if(k>n)
      {
         if (mp[ans[n]][1]==1 || mp[1][ans[n]]==-1) flag=1;
         return;
      }
      bool ok=0;
      for(int i=1;i<=n;i++) //这里要是不减枝,有一个8分的点过不去,会tle
      if (!vis[i])
        if (mp[i][1]==1 || mp[1][i]==-1) {ok=1; break;}
      if (!ok) return;
      for(int i=2;i<=n;i++)
      if (!vis[i]  && (mp[fa][i]==1 || mp[i][fa]==-1) )
      {
         ans[k]=i;
         vis[i]=1;
         dfs(k+1,i);
         if (flag) return;
         vis[i]=0;
      }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            char ch[25];
            scanf("%s",&ch);
            for(int j=0;j<n;j++)
              if (ch[j]=='W') mp[i][j+1]=1;
               else if (ch[j]=='L')  mp[i][j+1]=-1;
        }
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        ans[1]=1;
        mp[0][1]=1;
        flag=0;
        dfs(2,1);
    
        if(flag)
        {
            for(int i=1;i<n;i++)
            printf("%d ",ans[i]);
             printf("%d
    ",ans[n]);
        } else printf("No Solution
    ");
    
        return 0;
    }
  • 相关阅读:
    HTML5小时钟
    简单画板
    li样式不显示使用overflow:hidden导致Li前面点、圈等样式不见
    Dede 列表页 缩略图 有显示无则不显示
    CSS3的position:sticky介绍
    json 包含字段及函数的写法
    PHP+Ajax 异步通讯注册验证
    find命令结合cp bash mv 命令使用的4种方式
    markdown完整语法规范3.0+编辑工具介绍
    几款 ping tcping 工具总结
  • 原文地址:https://www.cnblogs.com/stepping/p/6711043.html
Copyright © 2011-2022 走看看