PAT L3-015 ---- 球队“食物链”(DFS)

球队“食物链”
某国的足球联赛中有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

学校去年举办的程序设计大赛,当时大一只做出来几个水题,后面的大题根本看不懂,时隔将近一年想回去试试能不能AC了那些题。。。。。。事实证明,还有些差距。下面将给出我的思路。

无题解纯自己思考,看完题目想到了TSP问题,算法还算是给了我一定的思绪,我记得好像可与用dfs()解决。
但是做的过程中发现,输入的数据会发生一些问题,仔细排查后原来是由于nexLine()会读取上一个回车导致的,之前也遇到过,只是当时搞明白之后就没有再碰。
接下来就是自己手写dfs(),第一次尝试自己写,而看着模板,但是发现好几个点过不去,比如如何确定跳出时机,如何实现字典序输出,我在主函数写f(1)这不是只能是1开头了。很迷。下面的代码运行不出结果。

import java.util.Scanner;public class Main {static String[][] str;static int n;static int cnt = 0;static boolean[][] vis;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();str = new String[n + 1][n + 1];vis = new boolean[n + 1][n + 1];/*** 注意nextLine()会读取上一个回车* */       for (int i = 0; i < n+1; i++) {String s = in.nextLine();str[i] = s.split("");}f(1);
//      for (int i = 1; i < n+1; i++) {
//          for (int j = 1; j < n+1; j++) {
//              System.out.print(str[i][j] + " ");
//          }
//          System.out.println();
//      }}private static void f(int m) {// TODO Auto-generated method stubif (cnt > m) {}for (int i = 1; i < n+1; i++) {for (int j = 1; j < n+1; j++) {if (str[i][j].equals("W")) {vis[i][j] = true;f(j);}}}}
}

接下来看题解,一开始就发现自己做了一个非常繁琐的操作进行存储数据,而题解的做法是直接用boolean数组存,‘W’是true,‘L’是false,巧妙不少。结尾输出的方式也是巧妙,第一个不打印空格,之后都在打印之前加一个空格,可以巧妙的避免结尾的空格影响AC。
这道题跟单纯的TSP问题区别就在于TSP是对于无向赋权图来说找出最短的哈密顿回路,而这道题是对于有向无权图来说的(为什么是有向的,这是因为主客场制出现A在主场赢了B,A在客场也赢了B的情况)。当然剪枝之后效率会更好,但是蒟蒻的我还是不要把自己越搞越迷糊的好。

import java.util.Scanner;public class Main {static boolean[][] a;static int n;static int cnt = 0;static int flag = 0;static int[] res;static boolean[] vis;public static void main(String[] args) {Scanner in = new Scanner(System.in);n = in.nextInt();a = new boolean[n + 1][n + 1];vis = new boolean[n + 1];res = new int[n + 1];/*** 注意nextLine()会读取上一个回车* */       for (int i = 0; i <= n; i++) {String s = in.nextLine();for (int j = 0; j < s.length(); j++) {if (s.charAt(j) == 'W') {a[i][j+1] = true;} if (s.charAt(j) == 'L'){a[j+1][i] = true;}}}f(1, 1);if (flag == 1) {for (int i = 1; i <= n; i++) {System.out.print(i == 1 ? "" : " ");System.out.print(res[i]);}} else {System.out.println("No Solution");}}private static void f(int cur, int num) {if (flag == 1) {return;}res[cur] = num;if (cur == n && a[num][1] == true) {flag = 1;return;}if (cur == n) {return; }vis[num] = true;for (int i = 1; i <= n; i++) {if (vis[i] == false && a[num][i] == true) {f(cur + 1, i);}}vis[num] = false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

samba配置

samba配置&#xff1a; sudo ufw disable //关闭防火墙 sudo ufw enable //开启 sudo ufw status //查看状态 sudo vim /etc/samba/smb.conf # # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configura…

21.Merge Two Sorted Lists 、23. Merge k Sorted Lists

21.Merge Two Sorted Lists 初始化一个指针作为开头&#xff0c;然后返回这个指针的next class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* dummy new ListNode(-1);ListNode* p dummy;while(l1 && l2){if(l1->val < …

求最大公约数----辗转相除法

辗转相除法&#xff08;求最大公倍数&#xff09; 一般写法&#xff1a; public class Main {public static void main(String[] args) {System.out.println(gcd(18, 2));}private static int gcd(int a, int b) {// TODO Auto-generated method stubwhile (b ! 0) {int c a…

使用kubeadm安装kubernetes高可用集群

kubeadm安装kubernetes高可用集群搭建 第一步&#xff1a;首先搭建etcd集群yum install -y etcd配置文件 /etc/etcd/etcd.confETCD_NAMEinfra1 ETCD_DATA_DIR"/var/lib/etcd" ETCD_LISTEN_PEER_URLS"https://172.20.0.113:2380" ETCD_LISTEN_CLIENT_URLS&q…

蓝桥杯第七届国赛JAVA真题----平方末尾

平方末尾 能够表示为某个整数的平方的数字称为“平方数” 比如&#xff0c;25,64 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。 因为平方数的末位只可能是&#xff1a;[0, 1, 4, 5, 6, 9] 这6个数字中的某个。 所以&#xff0c;432543533…

紫书 团队队列(队列)

1.用两个队列来维护成员&#xff0c;一个队列维护队伍编号&#xff0c;一个队列数组维护每个队伍的成员 ps: 紫书p118 #include <bits/stdc.h> using namespace std;int t, k, x, y; queue<int> allq; queue<int> q[12]; vector<int> v; string s1&quo…

蓝桥杯第七届国赛JAVA真题----七星填数

七星填数 如图【图1.png】所示。 在七角星的14个节点上填入1~14 的数字&#xff0c;不重复&#xff0c;不遗漏。 要求每条直线上的四个数字之和必须相等。 图中已经给出了3个数字。 请计算其它位置要填充的数字&#xff0c;答案唯一。 填好后&#xff0c;请提交绿色节点的4个…

Codeforces Round 546 (Div. 2)

layout: post title: Codeforces Round 546 (Div. 2) author: "luowentaoaa" catalog: true tags: mathjax: true - codeforces - 贪心 - 数学 - 线段树 传送门 A - Nastya Is Reading a Book (签到) 题意 给出每一章的页数范围&#xff0c;然后告诉你当前看到那一页…

洛谷 P1219 ---- 八皇后

题目描述 检查一个如下的6 x 6的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得每行、每列有且只有一个&#xff0c;每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。 上面的布局可以用序列2 4 6 1 3 5来描述&#xff0c;第i个数字表示在第i行…

PXE(preboot execution environment):【网络】预启动执行环节:引导 live光盘 ubuntu livecd 16.4:成功...

default menu.c32label ubuntu menu label ubuntu (version 16.04) kernel ub1604/casper/vmlinuz append root/dev/nfs bootcasper netbootnfs nfsroot192.168.56.1:/e/_temp/ub1604 initrdub1604/casper/initrd quiet splash --# 关键是搭建nfs相应的服务器器并export解压后的…

PHP实现多文件上传

PHP文件上传流程 单击提交按钮&#xff0c;浏览器用户将包含上传文件的表单数据提交给PHP处理程序Web服务器和PHP预处理器首先判断表单数据的大小是否超过php.ini配置文件中的post_max_size选项设置的上限值。 若超过&#xff0c;PHP处理程序将无法得到任何表单数据&#xff0…

bzoj5324:[Jxoi2018]守卫

传送门 首先考虑定下一个端点&#xff0c;然后剩下的就可以递推了 一开始想的是定下左端点&#xff0c;然后预处理出位置最远能看到的位置&#xff0c;后来发现时间GG了 看题解发现定右端点优秀得多 记录下当前\(r\)最远能看到的位置\(p\)&#xff0c;能看到\([p,r]\)一共需要几…

蓝桥杯第八届省赛JAVA真题----分巧克力

标题&#xff1a; 分巧克力 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克…

蓝桥杯第八届省赛JAVA真题----油漆面积

标题&#xff1a;油漆面积 X星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个机器人都会报告…

练习2——顺序表

//实现顺序表基本功能&#xff0c;然两个顺序表相并 #include <iostream> #include <stdlib.h> using namespace std; typedef int T; class SeqList{T *data;int MaxSize;int last; public:SeqList(int sz);~SeqList(){delete [] data;}int Length() const {retur…

docker占满linux磁盘根目录的解决办法

一、磁盘根目录被占满 [testlocalhost docker]$ df -lh Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 50G 0G 100% / devtmpfs 7.7G 0 7.7G 0% /dev tmpfs 7.8G 0 7.8G 0…

蓝桥杯第八届省赛JAVA真题----包子凑数

标题&#xff1a;包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼&#xff0c;其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买X个包子&#xff0c;卖包子的大叔就会迅速选出若干笼包子来&…

蓝桥杯第八届省赛JAVA真题----字母组串

标题&#xff1a;字母组串 由 A,B,C 这3个字母就可以组成许多串。 比如&#xff1a;”A”,”AB”,”ABC”,”ABA”,”AACBB” …. 现在&#xff0c;小明正在思考一个问题&#xff1a; 如果每个字母的个数有限定&#xff0c;能组成多少个已知长度的串呢&#xff1f; 他请好…

蓝桥杯第八届省赛JAVA真题----9数算式

标题&#xff1a;9数算式 观察如下的算式&#xff1a; 9213 x 85674 789314562 左边的乘数和被乘数正好用到了1~9的所有数字&#xff0c;每个1次。 而乘积恰好也是用到了1~9的所有数字&#xff0c;并且每个1次。 请你借助计算机的强大计算能力&#xff0c;找出满足如上要…

《剑指offer》第五十三题(数组中数值和下标相等的元素)

// 面试题53&#xff08;三&#xff09;&#xff1a;数组中数值和下标相等的元素 // 题目&#xff1a;假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素。例如&#xff0c;在数组{-3, -1, // 1, 3, 5}中…