題解 《演算法競賽高階指南》遞迴實現排列型列舉

2021-09-29 17:46:42 字數 2026 閱讀 3814

把 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...