把 1∼n
1\sim n
1∼n 這 n(n
<10)
n(n \lt 10)
n(n<10
)個整數排成一行後隨機打亂順序,輸出所有可能的次序。
按照從小到大的順序輸出所有方案,每行1個。 首先,同一行相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。
迴圈遍歷1-n個數,優先遍歷小的數,讓其盡可能的選遍歷到的數。並需要用乙個標記用的陣列,來標記這個數有沒有被選擇。如果沒有被選擇繼續遍歷下去。如果被選擇了,就跳過這個數。然後遍歷結束後的回溯時,取消這個數的標記,好讓其跟其它的數進行組合。(這遞迴的三題真是一題比一題簡單。。。)
時間複雜度:o(n
!)
o(n!)
o(n!
)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fi first
#define se second
#define mp make_pair
#define p pair
#define pll pair
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (tree[p].l+tree[p].r)>>1
#define sca(x) scanf("%d",&x)
#define sca2(x,y) scanf("%d%d",&x,&y)
#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define pri(x) printf("%d\n",x)
#define prl(x) printf("%lld\n",x)
#define for(i,x,y) for(int i=x;i<=y;i++)
#define _for(i,x,y) for(int i=x;i>=y;i--)
#define fast_io std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define stop system("pause")
#define ll long long
const
int inf=
0x3f3f3f3f
;const ll infl=
0x3f3f3f3f3f3f3f3f
;const
double pi =
acos(-
1.0)
;using
namespace std;
template
<
class
t>
void
tomax
(t&a,t b)
template
<
class
t>
void
tomin
(t&a,t b)
const
int n=10+
5;int out[n]
,n,vis[n]
;void
dfs(
int k)
for(
int i=
1;i<=n;i++)}
intmain()
演算法競賽高階指南 遞迴實現指數型列舉
從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入乙個整數n。每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。1 n 15 33 22 3 11 3 1 ...
演算法競賽高階指南 遞迴實現排列型列舉
把 1 n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。輸入格式 乙個整數n。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。資料範圍 1 n 9 輸入樣例 3輸出樣例 1 2...
遞迴實現組合型列舉 演算法競賽高階指南
從 1 n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。輸入格式 兩個整數 n,m 在同一行用空格隔開。輸出格式 按照從小到大的順序輸出所有方案,每行1個。首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面 例如1...