L3 2 球隊「食物鏈」 30分

2021-10-01 12:33:00 字數 1920 閱讀 1043

某國的足球聯賽中有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 球隊...