链接

题目描述:

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

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

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

输入格式:

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

输出格式:

按题目要求找到“食物链” T 1 ​ , T 2 , ⋯ , T N T_1​,T_2, ⋯, T_N T1​​,T2​,⋯,TN​ ,将这 N N N 个数依次输出在一行上,数字间以 1 1 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

思路:

直接使用 d f s dfs dfs 复杂度为 O( n ! n! n!),会有一个测试点超时。我用了记忆化的方法,将 “当前搜索位置相同、且剩余未搜索的结点相同” 的状态看做是等价的。

例如:有 10 10 10 支球队,如果已访问路线为 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 并且这条路线往下搜没有可行解。那么就认为当已访问路线为 1 , 3 , 2 , 4 1,3,2,4 1,3,2,4 时,继续往下搜也不可能有可行解。

这样,等价的状态只搜索一次。

把已访问的路径状态压缩为 20 20 20 位二进制;当前位置最大取值 20 20 20,用 5 5 5 位二进制来表示。然后进行记忆化搜索。最坏情况就是所有的状态都搜索过一次,复杂度 O( n 2 n n2^n n2n)。

有很多题解用了剪枝来做这道题,剪枝条件为 “当剩余队伍中不存在战胜第一支队伍,那么这条线就没必要继续深入”。 显然这样的方法复杂度没有保证,有很多数据可以卡掉这样的程序:

20
-WWWWWWWWWWWWWWWWWWW
W-WWWWWWWWWWWWWWWWWD
WW-WWWWWWWWWWWWWWWWD
WWW-WWWWWWWWWWWWWWWD
WWWW-WWWWWWWWWWWWWWD
WWWWW-WWWWWWWWWWWWWD
WWWWWW-WWWWWWWWWWWWD
WWWWWWW-WWWWWWWWWWWD
WWWWWWWW-WWWWWWWWWWD
WWWWWWWWW-WWWWWWWWWD
WWWWWWWWWW-WWWWWWWWD
WWWWWWWWWWW-WWWWWWWD
WWWWWWWWWWWW-WWWWWWD
WWWWWWWWWWWWW-WWWWWD
WWWWWWWWWWWWWW-WWWWD
WWWWWWWWWWWWWWW-WWWD
WWWWWWWWWWWWWWWW-WWD
WWWWWWWWWWWWWWWWW-WD
WWWWWWWWWWWWWWWWWW-D
DWDDDDDDDDDDDDDDDDD-

这组数据的输出为:

1 20 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

上面的剪枝方法不能很好地处理这样的数据。

#include<bits/stdc++.h>
using namespace std;
const int N=30;
char mp[N][N];
int n,path[N],vis;
unordered_set<int> st;bool dfs(int x,int step){vis^=(1<<x);if(st.count(vis|(x<<21))){ vis^=(1<<x); return false; }st.insert(vis|(x<<21));path[step]=x;if(step==n&&(mp[x][1]=='W'||mp[1][x]=='L')) return true;for(int i=1;i<=n;i++){if(!(vis&(1<<i))&&(mp[x][i]=='W'||mp[i][x]=='L')){if(dfs(i,step+1)) return true;}}vis^=(1<<x);return false;
}int main(){(cin>>n).get();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cin>>mp[i][j];if(i!=n) cin.get();}bool flag=dfs(1,1);if(flag) for(int i=1;i<=n;i++) cout<<path[i]<<" \n"[i==n];else cout<<"No Solution\n";
}

天梯赛L3-015 球队“食物链”(状态压缩、记忆化搜索)相关推荐

  1. 搜索问题之状态空间搜索(状态压缩+记忆化搜索+ BFS)

    文章目录 1. 前言 2. 问题举例(九宫格问题) 3. 问题分析 3.1 状态编码与解码 3.2 哈希映射 3.3 集合判重 4. 问题实现 推荐阅读 1. 前言 之前介绍的回溯法常用于 解空间的搜 ...

  2. LeetCode 464. 我能赢吗(状态压缩+记忆化递归 / 博弈)

    文章目录 1. 题目 2. 解题 1. 题目 在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的 ...

  3. 中石油训练赛 - The King’s Ups and Downs(记忆化搜索)

    题目描述 The king has guards of all different heights. Rather than line them up in increasing or decreas ...

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

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

  5. 【每日一题Day95】LC1815得到新鲜甜甜圈的最多组数 | 状态压缩dp 记忆化搜索

    得到新鲜甜甜圈的最多组数[LC1815] 有一个甜甜圈商店,每批次都烤 batchSize 个甜甜圈.这个店铺有个规则,就是在烤一批新的甜甜圈时,之前 所有 甜甜圈都必须已经全部销售完毕.给你一个整数 ...

  6. 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索

    [AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 【bfs + 记忆化搜索 + 剪枝】 AC 代码

    ACM 北京区域赛 bfs+剪枝+ms 第一个一遍过的题目,基本没有看题解 记忆搜索当中,注意初始化成一个特殊值:而在访问之后,每个点就会有一个不同于INF(或者 -1等特殊标记)的值 先到先得,适者 ...

  8. LuoguP3183 [HAOI2016]食物链 记忆化搜索

    题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3.... ...

  9. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  10. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐下象棋(记忆化搜索dp,dfs)

    题干: 小乐乐一天天就知道玩,这一天又想玩象棋. 我们都知道马走日. 现在给定一个棋盘,大小是n*m,把棋盘放在第一象限,棋盘的左下角是(0,0),右上角是(n - 1, m - 1); 小乐乐想知道 ...

最新文章

  1. java无刷新上传图片_【java实现web文件无刷新上传】
  2. Tiobe 发布2011年2月开发语言排名,C#和Python在2011年继续上升
  3. iphone屏幕上的圆圈怎么设置_iphone亮度条不变屏幕变暗怎么回事【解决方法】
  4. WriteN, RTMP send error
  5. PHP 中 call_user_func 的使用
  6. 使用ASP.NET MVC Futures 中的异步Action 【转】
  7. UTM坐标和WGS84坐标(如何转换?)
  8. php匿名聊天室开源,[开源项目]基于WebSocket的匿名聊天室
  9. matlab maps 指北针和比例尺,R 地图绘制-比例尺与指北针
  10. solidworks重建模型好慢_解决SolidWorks拉伸模型提示“重建模型错误”的方法
  11. 计算机应用与管理四季,[计算机软件及应用]四季PPT.ppt
  12. 用Java swing写的一个音乐播放器的个性化界面实现作业(只有界面!)
  13. 分段三次埃尔米特插值
  14. IE浏览器CSS hack方式一览
  15. Python使用traceback.print_exc()输出异常信息
  16. 散列表、散列函数和散列冲突以及应用场景(一文看懂)
  17. Mysql 中 case when then else end 用法
  18. U盘怎么量产 怎么对U盘进行量产
  19. 【木叶精品系统】木叶 GhostXP SP3 纯净版/装机版_2013.06
  20. 百度地图绘画行政区域

热门文章

  1. 7.0以上android.os.FileUriExposedException: file:///storage/emulated/0/xxx.xxx exposed beyond app的bug解决
  2. 物联网的致命弱点是什么?
  3. 还原一个数据库:mysql -h localhost -u root -p123456 wwwc:\www.sql 备份一个数据库:mysqldump -h localhost -u root
  4. [MySQL]local-infile报错
  5. 计算机教育专业发展策略论文,职业院校计算机教育现状和改革策略论文
  6. 个人理财第十课-【债券基金】筛选实操课
  7. 发作性睡病患者是否需要药物治疗?
  8. 老黄谈数据分析与数据建模
  9. TextRange对象与Range对象的使用
  10. 曙光联手北京计算中心 打造云计算联合实验室