演算法提高 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沒什麼關係,也沒有圖給我們搜尋,其實對於一道題,最難的...