日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/15 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;} }

總結

以上是生活随笔為你收集整理的PAT L3-015 ---- 球队“食物链”(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。