PAT L3-015 ---- 球队“食物链”(DFS)
球隊“食物鏈”
某國的足球聯(lián)賽中有N支參賽球隊,編號從1至N。聯(lián)賽采用主客場雙循環(huán)賽制,參賽球隊兩兩之間在雙方主場各賽一場。
聯(lián)賽戰(zhàn)罷,結(jié)果已經(jīng)塵埃落定。此時,聯(lián)賽主席突發(fā)奇想,希望從中找出一條包含所有球隊的“食物鏈”,來說明聯(lián)賽的精彩程度。“食物鏈”為一個1至N的排列{ T1,T2, …,TN },滿足:球隊T1戰(zhàn)勝過球隊T2,球隊T2戰(zhàn)勝過球隊T3,……,球隊T(N-1)戰(zhàn)勝過球隊TN,球隊TN戰(zhàn)勝過球隊T1。
現(xiàn)在主席請你從聯(lián)賽結(jié)果中找出“食物鏈”。若存在多條“食物鏈”,請找出字典序最小的。
注:排列{ a1,a2,…,aN }在字典序上小于排列{ b1,b2, … ,bN },當(dāng)且僅當(dāng)存在整數(shù)K(1 <= K <= N),滿足:aK < bK且對于任意小于K的正整數(shù)i,ai=bi。
輸入格式:
輸入第一行給出一個整數(shù)N(2 <= N <= 20),為參賽球隊數(shù)。隨后N行,每行N個字符,給出了NxN的聯(lián)賽結(jié)果表,其中第i行第j列的字符為球隊i在主場對陣球隊j的比賽結(jié)果:“W”表示球隊i戰(zhàn)勝球隊j,“L”表示球隊i負(fù)于球隊j,“D”表示兩隊打平,“-”表示無效(當(dāng)i=j時)。輸入中無多余空格。
輸出格式:
按題目要求找到“食物鏈”T1,T2 ,…,TN,將這N個數(shù)依次輸出在一行上,數(shù)字間以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學(xué)校去年舉辦的程序設(shè)計大賽,當(dāng)時大一只做出來幾個水題,后面的大題根本看不懂,時隔將近一年想回去試試能不能AC了那些題。。。。。。事實證明,還有些差距。下面將給出我的思路。
無題解純自己思考,看完題目想到了TSP問題,算法還算是給了我一定的思緒,我記得好像可與用dfs()解決。
但是做的過程中發(fā)現(xiàn),輸入的數(shù)據(jù)會發(fā)生一些問題,仔細(xì)排查后原來是由于nexLine()會讀取上一個回車導(dǎo)致的,之前也遇到過,只是當(dāng)時搞明白之后就沒有再碰。
接下來就是自己手寫dfs(),第一次嘗試自己寫,而看著模板,但是發(fā)現(xiàn)好幾個點過不去,比如如何確定跳出時機(jī),如何實現(xiàn)字典序輸出,我在主函數(shù)寫f(1)這不是只能是1開頭了。很迷。下面的代碼運行不出結(jié)果。
接下來看題解,一開始就發(fā)現(xiàn)自己做了一個非常繁瑣的操作進(jìn)行存儲數(shù)據(jù),而題解的做法是直接用boolean數(shù)組存,‘W’是true,‘L’是false,巧妙不少。結(jié)尾輸出的方式也是巧妙,第一個不打印空格,之后都在打印之前加一個空格,可以巧妙的避免結(jié)尾的空格影響AC。
這道題跟單純的TSP問題區(qū)別就在于TSP是對于無向賦權(quán)圖來說找出最短的哈密頓回路,而這道題是對于有向無權(quán)圖來說的(為什么是有向的,這是因為主客場制出現(xiàn)A在主場贏了B,A在客場也贏了B的情況)。當(dāng)然剪枝之后效率會更好,但是蒟蒻的我還是不要把自己越搞越迷糊的好。
總結(jié)
以上是生活随笔為你收集整理的PAT L3-015 ---- 球队“食物链”(DFS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack Nova日志相关
- 下一篇: 有啥別有病