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
kk
且對於任意小於
k的正整數i,
ai
=b
i。
輸入第一行給出乙個整數n(
2≤n≤
20),為參賽球隊數。隨後
n行,每行
n個字元,給出了n×
n的聯賽結果表,其中第i行第
j列的字元為球隊
i在主場對陣球隊
j的比賽結果:w
表示球隊
i戰勝球隊
j,l
表示球隊
i負於球隊
j,d
表示兩隊打平,-
表示無效(當i=
j時)。輸入中無多餘空格。
按題目要求找到「食物鏈」t
1t
2
⋯ t
n,將這
n個數依次輸出在一行上,數字間以1個空格分隔,行的首尾不得有多餘空格。若不存在「食物鏈」,輸出「no solution」。
5
-lwdw
w-ldw
ww-lw
dww-w
ddlw-
1 3 5 4 2
5
-wddw
d-dwl
dd-dw
ddw-d
dddd-
no solution
暴力dfs,注意有個位置要剪枝, 剪去的是 後面未取出的都不能戰勝一號。
#include#include #include #include #include #include using namespace std;
char s[200];
int mp[40][40];
int vis[200];
int ans[200];
int n;
int cnt=0;
int flag=1;
setst;
void dfs(int u,int ced)
flag=0;
return ;
}int has=0;
for(int i=1;i<=n;i++)
}
if(!has)
return ;
for(int i=1;flag&&i<=n;i++)
}}int main()
}cnt=1;
vis[1]=1;
ans[1]=1;
dfs(1,2);
if(flag)
printf("no solution");
return 0;
}
L3 2 球隊「食物鏈」 30分
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至n的排列,滿足 球隊t 1 戰勝過球隊t 2 球隊t 2 戰...
L3 015 球隊「食物鏈」 30分
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至n的排列,滿足 球隊t 1 戰勝過球隊t 2,球隊t 2戰勝...
球隊「食物鏈」
某國的足球聯賽中有n支參賽球隊,編號從1至n。聯賽採用主客場雙迴圈賽制,參賽球隊兩兩之間在雙方主場各賽一場。聯賽戰罷,結果已經塵埃落定。此時,聯賽主席突發奇想,希望從中找出一條包含所有球隊的 食物鏈 來說明聯賽的精彩程度。食物鏈 為乙個1至nnn的排列,滿足 球隊t1戰勝過球隊t2t 2t 2 球隊...