PTA 5-15 球队“食物链” (2017cccc初赛L3-3)
来源:互联网 发布:手机影视剪辑软件 编辑:程序博客网 时间:2024/06/05 05:59
5-15 球队“食物链” (30分)
某国的足球联赛中有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个字符,给出了N×N的联赛结果表,其中第i行第j列的字符为球队i在主场对阵球队j的比赛结果:W
表示球队i战胜球队j,L
表示球队i负于球队j,D
表示两队打平,-
表示无效(当i=j时)。输入中无多余空格。
输出格式:
按题目要求找到“食物链”T1 T2 ⋯ TN,将这N个数依次输出在一行上,数字间以1个空格分隔,行的首尾不得有多余空格。若不存在“食物链”,输出“No Solution”。
输入样例1:
5-LWDWW-LDWWW-LWDWW-WDDLW-
输出样例1:
1 3 5 4 2
输入样例2:
5-WDDWD-DWLDD-DWDDW-DDDDD-
输出样例2:
No Solution
提示题意:
略。
思路:
剪枝思路来源:http://www.liuchuo.net/
我们可以这样建图:
字符为'W'的建从i(当前行号)到j(当前列号)的边,字符为'L'的建从j(当前行号)到i(当前列号)的边,用dfs从1节点遍历+回溯去求哈密顿回路。
剪枝条件:dfs到某个子序列时,如果当前未访问节点无法与1节点构成回路,就不往下搜索。
示例程序
#include <cstdio>#include <cstring>using namespace std;int mp[20][20],a[20],v[20],n,flag=0;void dfs(int t,int deep){ int i; if(flag==1) { return; } a[deep]=t; if(deep==n-1) { if(mp[t][0]==1) { flag=1; } return; } for(i=1;n>i;i++)//剪枝 { if(v[i]==0&&mp[i][0]==1) { break; } } if(n==i)//无法构成回路,停止搜索 { return; } for(i=1;n>i;i++) { if(v[i]==0&&mp[t][i]==1) { v[i]=1; dfs(i,deep+1); v[i]=0; } }}int main(){ int i,i1; char s[21]; scanf("%d",&n); memset(mp,0,sizeof(mp)); memset(v,0,sizeof(v)); for(i=0;n>i;i++) { scanf("%s",s); for(i1=0;s[i1]!='\0';i1++) { if(s[i1]=='W')//建图 { mp[i][i1]=1; } else if(s[i1]=='L') { mp[i1][i]=1; } } } v[0]=1; dfs(0,0); if(flag==1) { for(i=0;n>i;i++) { if(i==0) { printf("%d",a[i]+1); } else { printf(" %d",a[i]+1); } } } else { printf("No Solution"); } return 0;}
- PTA 5-15 球队“食物链” (2017cccc初赛L3-3)
- 5-15 球队“食物链” (30分) -- L3-015. 球队“食物链” (2017天梯初赛 剪枝dfs)
- 2017CCCC天梯赛—L3-3球队“食物链”
- L3-015. 球队“食物链”
- PTA 5-10 多项式A除以B (2017cccc初赛L2-2)
- PAT-练习集-L3-015. 球队“食物链”
- 团体程序设计天梯赛L3-015 球队“食物链”
- 团体程序设计天梯赛-L3-015-球队“食物链”(状压dfs)
- 团体程序设计天梯赛-练习集 -- L3-015. 球队“食物链”(状压+dfs 求哈密顿回路)
- (2017cccc天梯赛团体初赛)写在前边
- L3-013. 非常弹的球(2017初赛)
- CCCC L3-011直捣黄龙 解题报告
- cccc L3-013. 非常弹的球
- CCCC初赛 关于堆的判断
- PTA C4 L3-010 树状数组
- CCCC L3-010. 是否完全二叉搜索树
- PAT CCCC L3-1 凑零钱(DFS)
- CCCC-GPLT L3-014. 周游世界 团体程序设计天梯赛
- 网络流 入门整理
- P1966 火柴排队
- 中括号序列绘制(比较有意思)
- 线性表的顺序储存及基本操作
- renderScript实现图片处理雾化效果 浮雕效果
- PTA 5-15 球队“食物链” (2017cccc初赛L3-3)
- linux权限管理
- bootsect MBR VBR 磁盘 引导 修复
- 条件转移指令应用(1104)
- ITOO整体部署图
- 2016 第七届 蓝桥杯第7题 剪邮票(bfs+dfs)
- 预加载和懒加载(延迟加载)
- NOI2011阿狸的打字机
- 条件随机场(Conditional Random Field)简介