藍橋杯 3000公尺深度優先搜尋 全排列

2021-08-14 15:08:30 字數 1296 閱讀 6336

演算法提高 3000公尺排名**  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

3000公尺長跑時,圍觀黨們興高采烈地**著最後的排名。因為他們來自不同的班,對所有運動員不一定都了解,於是他們分別對自己了解的一些運動員的實力作出了評估,即對部分運動員做了相對排名的**,並且告訴了可憐留守的班長。因為無聊,於是他們就組團去打dota去了。比賽結束後他們向班長詢問最後的排名,但班長不記得了,只記得他們中哪些人的**是正確的,哪些人的**是錯誤的。他們想知道比賽的排名可能是什麼。

輸入格式

第一行兩個整數n, m,n為運動員數量,m為圍觀黨數量。運動員編號從0到n-1。

接下來m行,每行為乙個圍觀黨的相對排名**。每行第乙個數c表示他**的人數,後面跟著c個0~n-1的不同的數,表示他**的運動員相對排名,最後還有乙個數,0表示這個**是錯誤的,1表示是正確的。

輸出格式

第一行乙個數k為有多少種排名的可能。

下面k行,每行乙個0~n-1的排列,為某乙個可能的排名,相鄰的數間用空格隔開。所有排名按字典序依次輸出。

樣例輸入

input sample 1:

3 22 0 1 1

2 1 2 0

input sample 2:

3 22 0 1 1

2 2 1 0

樣例輸出

output sample 1: 2

0 2 1

2 0 1

output sample 2: 1

0 1 2

資料規模和約定

1<=n<=10, 2<=c<=n, 1<=m<=10,保證資料合法,且答案中排名可能數不超過20000。對於乙個排名序列,乙個**是正確的,當且僅當**的排名的相對順序是排名序列的乙個子串行。乙個**是錯誤的,當且僅當這個**不正確。

#include#include#include#include#includeusing namespace std;

int str[15][15];

int ctr[15];

bool use[15];

int graph[20001][15];

int size;

int m,n;

int judge()//匹配判斷

}memset(use,true,sizeof(use));//初始化

size=0;

dfs(0);//從第零號球員開始搜

cout

}return 0;

}

全排列(深度優先搜尋)

description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...

深度優先搜尋 全排列

題目要求 輸入乙個數n,輸出1 n的全排列。比如,輸入3,輸出123 132 213 231 312 321。解題思路 用深度優先搜尋,假設有n個盒子,從第乙個盒子開始依次放直到放到最後乙個盒子,期間用到遞迴呼叫。放到最後乙個後,再依次返回,進行重新組合,其中還用到標記陣列來判斷是否被用過。實現 i...

深度優先搜尋(DFS) 全排列

題目描述 對於自然數n 按字典序輸出由1 n組成的所有不重複的數字序列,每行乙個序列,每個數字之間有乙個空格。例子 輸出 1 2 2 1例子 輸出1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 思路解析 猛一看上題跟dfs沒什麼關係,也沒有圖給我們搜尋,其實對於一道題,最難的...