一個蒟蒻的蛻變之路?
阿新 • • 發佈:2018-12-17
看見很多人用DFS 但我今天想說的是,STL教你做人 昨天我和dalao比誰的速度快 結果一個是,一個是 STL完勝 首先我要用一個神奇的函式 組合數學中經常用到排列,這裡介紹一個計算序列全排列的函式:,和。這兩個函式作用是一樣的,區別就在於前者求的是當前排列的下一個排列,後一個求的是當前排列的上一個排列。至於這裡的“前一個”和“後一個”,我們可以把它理解為序列的字典序的前後,嚴格來講,就是對於當前序列,他的下一個序列滿足:不存在另外的序列,使.
對於函式,其函式原型為:
#include <algorithm>
bool next_permutation(iterator start,iterator end)
噹噹前序列不存在下一個排列時,函式返回false,否則返回true
我們來看下面這個例子:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={1,2,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
return 0;
}
輸出結果為: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 當我們把中的3改為2時,輸出就變為了: 1 2 3 2 1 3 由此可以看出,函式是對陣列num中的前n個元素進行全排列,同時並改變陣列的值。 另外,需要強調的是,在使用前需要對欲排列陣列按升序排序,否則只能找出該序列之後的全排列數。比如,如果陣列num初始化為2,3,1,那麼輸出就變為了: 2 3 1 3 1 2 3 2 1 此外,可以對結構體按照自定義的排序方式進行排序。 現在我們就可以開始了 先貼程式碼:
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
//freopen("fuck.in", "r", stdin);
//freopen("fuck.out", "w", stdout);
int n;
scanf("%d",&n);
int a[n + 5];
for(int i = 0; i <= n - 1;i++)
a[i] = i + 1;
do
{
for(int i = 0;i <= n - 1;i++)
printf("%5d",a[i]);
printf("\n");
}while(next_permutation(a,a + n)); //函式的運用
return 0;
//fclose(stdin);
//fclose(stdout);
}