L3-015. 球队“食物链”

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

联赛战罢,结果已经尘埃落定。此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链”,来说明联赛的精彩程度。“食物链”为一个1至N的排列{ T1 T2 ... TN },满足:球队T1战胜过球队T2,球队T2战胜过球队T3,……,球队T(N-1)战胜过球队TN,球队TN战胜过球队T1【像是构成了一个遍历了所有节点一次的回路或者可以形成了一个环;那么如果存在,起点1一定可以做开头!毕竟可以形成一个环!】

现在主席请你从联赛结果中找出“食物链”。若存在多条“食物链”,请找出字典序最小的。【按照DFS进行有序搜索,一定满足字典序!】

注:排列{ 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时)。输入中无多余空格。

【这里需要再注意一点,mp[i][j]=='L' 等价于 mp[j][i]='W' ,这两个语句等可以表达出 i  战胜过j ;第二次WA的时候仔细揣摩了上面的那几个“过”字,有所新的领悟了!

AC题解如下:

基础搜索即可,保证有序:

1、第一次剪枝加了句,if(ans==1)return ;   //此处剪枝,多获得三分

2、第二次剪枝,把图转化成了邻接矩阵!//然并卵

3、第三次剪枝,在每次向下进行迭代的时候,跑一遍for循环——如果没有一个点可以回连到起点1就return ,就是下面未标记的解集里没有可以再回去连接到出发点1的路径了!

(写的时候省了点事,从下标0到n-1进行遍历,正好符合字符串的存贮位置!!)


  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<math.h>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<set>
  8 #include<vector>
  9 #include<string>
 10 #include<stack>//16:06--
 11 #define  inf 0x3f3f3f3f
 12 #define  dinf 0x7fffffff*1.0
 13 using namespace std;   //L3-015. 球队“食物链”
 14 #define N 1200
 15 #define ll long long
 16 int n;
 17 char mp[22][22];
 18 int ans;
 19 int tmp[22];//存贮结果的数组
 20 int vis[22];//标记行
 21 vector<int>G[22];//然并卵的邻接矩阵
 22 void dfs(int k,int step){//k表示要搜索的下一行的标号,step表示已经完成的行数
 23   //  printf("k=%d step=%d\n",k,step);
 24     if(ans==1)return ;   //此处剪枝,多获得三分
 25     tmp[step]=k+1;
 26     if(step==n-1){
 27         if(mp[k][0]=='W'){
 28             ans=1;
 29         }
 30         return ;
 31     }
 32     int i;
 33     for( i=0;i<n;i++){
 34         if(!vis[i]&&(mp[i][0]=='W'))
 35             break;
 36     }
 37     if(i==n)return ;//存在未收录的点不与1相连,就是下面未确认的解集里没有可以连接到出发点0的路径了
 38
 39     for( i=0;i<G[k].size();i++){
 40         int v=G[k][i];//取出k战胜过的队伍编号
 41         if(!vis[v]){
 42             vis[v]=1;
 43             dfs(v,step+1);
 44             vis[v]=0;
 45         }
 46     }
 47 }
 48 void get_graph(){//生成邻接矩阵
 49     for(int i=0;i<n;i++){
 50         for(int j=0;j<n;j++){
 51             if(mp[i][j]=='W'){
 52                 G[i].push_back(j);
 53             }
 54         }
 55     }
 56 }
 57 int main(){
 58
 59     while(~scanf("%d",&n)){
 60         for(int i=0;i<=20;i++)//初始化邻接矩阵
 61             G[i].clear();
 62         for(int i=0;i<n;i++){
 63             scanf("%s",mp[i]);
 64         }
 65         for(int i=0;i<n;i++){
 66             for(int j=0;j<n;j++){   //mp[i][j]=='L' 等价于 mp[j][i]='W'
 67                 if(mp[i][j]=='L'){
 68                     if(mp[j][i]=='L')
 69                         mp[i][j]='W';
 70                     mp[j][i]='W';
 71                 }
 72             }
 73         }
 74         get_graph();//存成邻接矩阵
 75         ans=0;
 76         tmp[0]=1;
 77         for(int i=0;i<n;i++){
 78             memset(vis,0,sizeof(vis));
 79             vis[0]=1;
 80             if(mp[0][i]=='W'){
 81                 vis[i]=1;
 82                 dfs(i,1);
 83             }
 84             if(ans==1)break;
 85         }
 86         if(ans==1){
 87             for(int i=0;i<n-1;i++)
 88                 printf("%d ",tmp[i]);
 89             printf("%d\n",tmp[n-1]);
 90         }else{
 91             printf("No Solution\n");
 92         }
 93     }
 94
 95     return 0;
 96 }
 97
 98 /*
 99 3
100 -LL
101 L-L
102 LL-
103 */

View Code(带详细的注释)

转载于:https://www.cnblogs.com/zhazhaacmer/p/8619070.html

【搜索-剪枝-偏难】PAT-天梯赛-L3-015. 球队“食物链”相关推荐

  1. 2021/4/24团队设计天梯赛L3题目集及部分题解

    2021/4/24团队设计天梯赛L3题目集及部分题解: 以下题解都是通过PTA测试的,大致保证正确性: 查看题目戳此::PTA题目集 L3题目集 L3-01 森森旅游 (30 分) L3-02 还原文 ...

  2. pat天梯赛L1-052. 2018我们要赢

    L1-052. 2018我们要赢 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 2018年天梯赛的注册邀请码是"20 ...

  3. PAT天梯赛Level2题目题解汇总

    L2-001 紧急救援 /******************************************************************************* Date: 2 ...

  4. PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)

    L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...

  5. PAT天梯赛 L1-050 倒数第N个字符串

    题目链接:点击打开链接 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, ...

  6. pat天梯赛L1-050. 倒数第N个字符串

    L1-050. 倒数第N个字符串 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个完全由小写英文字母组成的字符串等差递增 ...

  7. 2021年CCCC天梯赛L3 还原文件题解

    题目如下 一份重要文件被撕成两半,其中一半还被送进了碎纸机. 我们将碎纸机里找到的纸条进行编号,如图 1 所示.然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子. 要求你输出 ...

  8. pat天梯赛L2-025. 分而治之

    L2-025. 分而治之 时间限制 600 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 分而治之,各个击破是兵家常用的策略之一.在战争中,我们 ...

  9. pat天梯赛L1-056. 猜数字

    L1-056. 猜数字 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一群人坐在一起,每人猜一个 100 以内的数,谁的数字最 ...

  10. pat天梯赛L1-055. 谁是赢家

    L1-055. 谁是赢家 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表 ...

最新文章

  1. python int函数详解_Python内置函数OCT详解
  2. iOS:触摸控件UITouch、事件类UIEvent
  3. Java 面向对象的特征---学习笔记
  4. AT5661-[AGC040C]Neither AB nor BA【模型转换】
  5. 中国程序员的前景并非一片黑暗,教你如何拥有光明的前程
  6. 计算机用键盘能干什么,年轻人的第一块智能键盘-半台MBP能干什么?
  7. avascript 运动中Offset的bug解决方案
  8. 传智播客 回归问题 学习笔记
  9. java无经验_应届生没有项目经验怎么面试?(java篇)
  10. IGBT双脉冲测试原理
  11. DLL load failed while importing _swigfaiss: 找不到指定的模块。
  12. labview与matlab接口,LabVIEW Comms与MATLAB®的互联接口
  13. 《数据清洗》 第六章 数据转换
  14. 4-产品需求文档PRD
  15. 本地SecureCRT连接VMware中XUbuntu
  16. JavaScript中的call(),apply(),伪数组转化为数组
  17. speedoffice表格如何全选表格
  18. python生成DataMatrix码(DataMatrix)
  19. 云计算和计算机应用的区别,普适计算与云计算的区别
  20. 网站URL如何SEO优化

热门文章

  1. 《Python分布式计算》第2章 异步编程 (Distributed Computing with Python)
  2. 1.4 Flink HDFS Connector /Flink HDFS连接器
  3. 电梯设计需求调研报告
  4. [LeetCode] Minimum Window Substring 散列映射问题
  5. 《Two Dozen Short Lessons in Haskell》学习(三)
  6. 服务器有效设置防止web入侵
  7. vc2005 seh新认识
  8. hashmap-put方法过程
  9. css3动画结束捕捉事件整理
  10. CentOS7下安装并简单设置PostgreSQL笔记