7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!
生活随笔
收集整理的這篇文章主要介紹了
7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
n個元素 {1,2, …,n} 有n!個不同的排列。將這 n! 個排列按字典序排列, 并編號為 0,1,…,n!-1 。每個排列的編號為其字典序值。例如,當n=3時,6個不同排列的字典序值如下:
字典序值 0 1 2 3 4 5
排列 123 132 213 231 312 321
輸入格式:
第一行是元素個數n(1<n<=8),接下來的1行是n個元素{1,2,…,n}的一個排列。題目不會給出最后一個排列。
輸出格式:
第一行輸出計算出的排列的字典序值,第二行輸出按字典序排列的下一個排列。
輸入樣例:
3 2 3 1輸出樣例:
3 3 1 2二:思路
這道題考察的還是全排列問題,那么在處理輸出全排列的基礎上,將所有輸出的數據進行,放在一個vector容器當中,進行排序,然后將輸入的數據(這里的將輸入的數據轉換成string類型來來實現字符串的拼接) 和vector中的數據進行比較
三:知識速遞(如果對全排列不太熟悉的可以看一下這個圖解)
全排列
四:上碼
#include<bits/stdc++.h> using namespace std;int N; vector<string>v;void swap(int A[],int i,int j){int temp = A[i];A[i] = A[j];A[j] = temp; } string printarr(int arr[]){//實現字符串的拼接 將int類型的數據 改為string進行字符串的拼接 stringstream st;for(int i = 0; i < N; i++){st << arr[i];}string str = st.str();return str; }void perm(int A[],int p,int q){if(p == q){string str = printarr(A);v.push_back(str); }else{for(int i = p; i <= q; i++){swap(A,p,i);perm(A,p+1,q);swap(A,p,i);}} }int main(){cin >> N;string str= "";for(int i = 0; i < N; i++){string nums;cin >> nums;str+=nums;}int arr[10];for(int i = 0; i < N; i++){arr[i] = i + 1;} perm(arr,0,N-1);sort(v.begin(),v.end());for(int i = 0; i < v.size(); i++){if(v[i] == str) {cout << i << endl;string str = v[i+1];for(int i = 0; i < str.size(); i++){if(i == 0)cout << str[i];else cout << ' ' << str[i];}break; } } }總結
以上是生活随笔為你收集整理的7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-1 输出全排列 (20 分)(全排列
- 下一篇: 苹果 macOS / iOS 修图工具