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进行遍历,正好符合字符串的存贮位置!!)


 #include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<stack>//16:06--
#define inf 0x3f3f3f3f
#define dinf 0x7fffffff*1.0
using namespace std; //L3-015. 球队“食物链”
#define N 1200
#define ll long long
int n;
char mp[][];
int ans;
int tmp[];//存贮结果的数组
int vis[];//标记行
vector<int>G[];//然并卵的邻接矩阵
void dfs(int k,int step){//k表示要搜索的下一行的标号,step表示已经完成的行数
// printf("k=%d step=%d\n",k,step);
if(ans==)return ; //此处剪枝,多获得三分
tmp[step]=k+;
if(step==n-){
if(mp[k][]=='W'){
ans=;
}
return ;
}
int i;
for( i=;i<n;i++){
if(!vis[i]&&(mp[i][]=='W'))
break;
}
if(i==n)return ;//存在未收录的点不与1相连,就是下面未确认的解集里没有可以连接到出发点0的路径了 for( i=;i<G[k].size();i++){
int v=G[k][i];//取出k战胜过的队伍编号
if(!vis[v]){
vis[v]=;
dfs(v,step+);
vis[v]=;
}
}
}
void get_graph(){//生成邻接矩阵
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(mp[i][j]=='W'){
G[i].push_back(j);
}
}
}
}
int main(){ while(~scanf("%d",&n)){
for(int i=;i<=;i++)//初始化邻接矩阵
G[i].clear();
for(int i=;i<n;i++){
scanf("%s",mp[i]);
}
for(int i=;i<n;i++){
for(int j=;j<n;j++){ //mp[i][j]=='L' 等价于 mp[j][i]='W'
if(mp[i][j]=='L'){
if(mp[j][i]=='L')
mp[i][j]='W';
mp[j][i]='W';
}
}
}
get_graph();//存成邻接矩阵
ans=;
tmp[]=;
for(int i=;i<n;i++){
memset(vis,,sizeof(vis));
vis[]=;
if(mp[][i]=='W'){
vis[i]=;
dfs(i,);
}
if(ans==)break;
}
if(ans==){
for(int i=;i<n-;i++)
printf("%d ",tmp[i]);
printf("%d\n",tmp[n-]);
}else{
printf("No Solution\n");
}
} return ;
} /*
3
-LL
L-L
LL-
*/

(带详细的注释)

【搜索-剪枝-偏难】PAT-天梯赛-L3-015. 球队“食物链”的更多相关文章

  1. 团体程序设计天梯赛(CCCC) L3015 球队“食物链” 状态压缩

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code #include <cstdio> #include ...

  2. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  3. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  4. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  5. PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索

    题目分析: 一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小 ...

  6. PAT 天梯赛 【】 L3-015. 球队“食物链” 【BFS+剪枝】

    题目链接 https://www.patest.cn/contests/gplt/L3-015 思路 用一个 数组标记 胜负 每次输入一行字符串 然后遍历 如果 碰到 W 那么 vis[i][j] = ...

  7. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  8. PAT天梯赛L3-015 球队食物链

    读题可以知道是DFS,注意一点,题目说的是赢过,所以str[i][j]=‘W',那么g[i][j]=1,str[i][j]='L',g[j][i]=1 然后就常规搜索即可,还有一点就是剪枝,如果没有可 ...

  9. PAT天梯赛L1-002 打印漏斗

    题目链接:点击打开链接 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形 ...

随机推荐

  1. Keystone

    Kenstone各个概念的比喻: User 住宾馆的人 Credentials 开启房间的钥匙 Authentication 宾馆为了拒绝不必要的人进出宾馆,专门设置的机制,只有拥有钥匙的人才能进出 ...

  2. 微服务Consul系列之服务部署、搭建、使用

    使用Consul解决了哪些问题 是否在为不同环境来维护不同项目配置而发愁 是否有因为配置的更改导致代码还要进行修改.发布因为客流量大了还要规避开高峰期等到半夜来发布 微服务架构下应用的分解业务系统与服 ...

  3. 【转】mysql 存储过程的示例

    原文地址:https://blog.csdn.net/lishaojun0115/article/details/50183661 begin #定义变量 declare local_sender v ...

  4. 【Chrome插件】Session Buddy--搁置标签页

    写在前面:看文章前请先看文章写作时间,避免浪费时间.2019-09-10 使用场景 Chrome打开许多网页,临时有事需要把当前的一些标签页一键保存,等待事后继续处理. 操作演示 原片地址:https ...

  5. 手把手教你如何安装Tensorflow(Windows和Linux两种版本)

    tensorflow 不支持Python2.7,最好选择下载Python3.5 现在越来越多的人工智能和机器学习以及深度学习,强化学习出现了,然后自己也对这个产生了点兴趣,特别的进行了一点点学习,就通 ...

  6. 开发规范——MYSQL数据库

    数据库规范 这里主要针对mysql数据库,其他数据库也可以借鉴 表 1.统一使用表命名规范 表名规范:分层+项目名缩写+实体名(小写)[+下划线+实体名+rel] 例子 表名:bc_user 分层: ...

  7. 03.linux入门命令

    1.linux命令的格式 命令 [选项] [参数] eg: ls ls -l ls -l /home 注: a.选项与参数不一定存在 b.选项用 "-" 来指明 c.命令,选项,参 ...

  8. Beginning Linux Programming 学习--chapter 11 Processes and Signals

     What's process--什么是进程? The UNIX standards, specifically IEEE Std 1003.1, 2004 Edition, defines a pr ...

  9. c++ 编译 curl 报错 数组‘__curl_rule_01__’的大小为负 解决方法

    背景:在原有的项目GCC编译环境下(arm-linux 32位),增加x86-linux 64位的编译环境,编译curl库的时候发生错误. 其他:编译服务器为64位Centos 编译错误提示 /inc ...

  10. 【SCALA】1、我要开始学习scala啦

    因为scala也是基于jvm上运行的,所以能跑java,原则上就能跑scala 1.国际惯例,先来个hello world走走 package demo1 //object之下全为静态,scala没有 ...