生活随笔
收集整理的這篇文章主要介紹了
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);
}
private static void f(
int m) {
if (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)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。