某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。
聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的「食物鏈」,來說明聯賽的精彩程度。「食物鏈」為乙個1至n的排列,滿足:球隊t
1 戰勝過球隊t
2 ,球隊t
2 戰勝過球隊t
3 ,⋯,球隊t
(n−1)
戰勝過球隊t
n ,球隊t
n 戰勝過球隊t
1 。
現在主席請你從聯賽結果中找出「食物鏈」。若存在多條「食物鏈」,請找出字典序最小的。
注:排列在字典序上小於排列,當且僅當存在整數k(1≤k≤n),滿足:a
k 輸入格式:
輸入第一行給出乙個整數n(2≤n≤20),為參賽球隊數。隨後n行,每行n個字元,給出了n×n的聯賽結果表,其中第i行第j列的字元為球隊i在主場對陣球隊j的比賽結果:w表示球隊i戰勝球隊j,l表示球隊i負於球隊j,d表示兩隊打平,-表示無效(當i=j時)。輸入中無多餘空格。
輸出格式:
按題目要求找到「食物鏈」t
1 t
2 ⋯ t
n ,將這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
題意: 給出球隊直接比賽勝利失敗平局的資訊,要求,是不是存在乙個鏈條,字典序最小,並且能夠打敗後面的隊伍,比如1-2-3。1打敗2,2打敗3,3打敗1.
分析:很明顯,dfs去跑,跑到最後個點之後,判斷下能不能打敗1號點,如果可以,那就是答案,因為我們從編號小的去跑,不用擔心字典序,第乙個答案就是字典序最小的。然後輸出。這樣做會超時,這裡存在乙個剪枝,就是每次判斷剩餘所有點,看看是不是和1存在打敗關係,如果剩餘點都打不敗1,那麼最終結果一定不會存在的,直接return就好了,30分到手。
ac**:
#include
#define ios() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using
namespace std;
intconst n=25;
int n;
int a[n]
[n];
string s;
int f;
int vis[n]
;int ans[n]
;void
dfs(
int index,
int num)
int flag=1;
for(
int i=
1;i<=n;i++)}
if(flag)
return;if
(index==n)
return
; vis[num]=1
;for
(int i=
1;i<=n;i++)}
vis[num]=0
;return;}
intmain()
if(s.
substr
(j,1)==
"w")}}
dfs(1,
1);if
(f)else}}
else
return0;
}
L3 2 球隊「食物鏈」(30 分)
n支參賽球隊,編號從1至 n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至 n的排列,滿足 球隊t 1 戰勝過球隊t 2 球隊t 2 戰勝過球隊t 3...
L3 015 球隊「食物鏈」 30分
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至n的排列,滿足 球隊t 1 戰勝過球隊t 2,球隊t 2戰勝...
球隊「食物鏈」
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至nnn的排列,滿足 球隊t1戰勝過球隊t2t 2t 2 球隊...