題目描述
輸出自然數 1 到 n 所有不重複的排列,即 n 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。
輸入格式
乙個整數 n。
輸出格式
由 1~n 組成的所有不重複的數字序列,每行乙個序列。
每個數字保留 5 個場寬。
輸入輸出樣例
輸入#1:
3輸出#1:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
hint
1<=n<=9
//create by eakal7
#include
//這種方法在n=9||8是直接超過了2e
#include
#include
#include
#include
using
namespace std;
int a[50]
=;int n, num, p;
int r;
int flag[10]
;int start;
int end_n;
intpailie
(int n)
}return1;
}void
pritn
(int e)
for(
int i = k -
1; i >=
0; i--
)printf
("\n");
}int
main()
for(
int i = start; i < end_n; i++
) r = i;
flag[r %10]
=1;while
(r /=10
)if(pailie
(n)==1)
}return0;
}
執行正常但是運算量太大,直接爆了,而且思想過於複雜,考慮到dfs想到應該可以dfs
#include
using
namespace std;
int n,pd[
100]
,used[
100]
;void
printt()
void
dfs(
int k)
//深搜函式,當前是第k格
for(i=
1;i<=n;i++)}
}int
main()
#include
#include
using
namespace std;
intmain()
sort
(a,a+n)
;//可以自行測試一下刪除後的結果
dowhile
(next_permutation
(a,a+n));
}return0;
}
next_permutation這個函式直接對1~n的全排列,並且是從陣列中當前的字典序開始依次增大直至到最大字典序。注:這個函式是直接改變陣列位址裡的數值的。
所以直接貼上改動後的**:
//create by eakal7
//next_permutation的debug nice!!!!
#include
#include
using
namespace std;
intmain()
printf
("\n");
while
(next_permutation
(temp, temp + n)
)printf
("\n");
}}return0;
}
ps:algorithm這個庫里還有好多挺好用的函式建議一一**
pps:第一篇部落格 by eakal7 2020.12.3
參考部落格:
關於全排列 next_permutation() 函式的用法
洛谷 P1706 全排列
可能是最簡單的題了 講真搜尋hhh 洛谷 輸出自然數1到n所有不重複的排列,即n的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 n 1 n 9 輸出格式 由1 n組成的所有不重複的數字序列,每行乙個序列。每個數字保留5個常寬。輸入樣例 1 3 輸出樣例 1 1 2 3 1 3 2...
洛谷 P1706 全排列問題
題目描述 輸出自然數 11 到 nn 所有不重複的排列,即 nn 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入格式 乙個整數 nn。輸出格式 由 1 sim n1 n 組成的所有不重複的數字序列,每行乙個序列。每個數字保留 55 個場寬。輸入輸出樣例 輸入 1 複製 3輸出 1 複...
洛谷P1706全排列問題
p1706全排列問題 題目描述 輸出自然數1到n所有不重複的排列,即n的全排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入輸出格式 輸入格式 n 1 n 9 輸出格式 由1 n組成的所有不重複的數字序列,每行乙個序列。每個數字保留5個常寬。輸入輸出樣例 輸入樣例 1 3輸出樣例 1 1 2...