ได้รับอาเรย์ a[] ที่มี N จำนวนเต็ม ท้าทายคือพิมพ์ k การเรียงสับของดัชนีที่ต่างกัน โดยค่าที่ดัชนีเหล่านั้นสร้างลำดับไม่ลดลง พิมพ์ -1 หากไม่เป็นไปได้
ตัวอย่าง
Input: arr[] = {2,5,6,2,2,2,2}, k = 4
Output:
0 3 4 5 6 1 2
3 0 4 5 6 1 2
0 3 4 5 6 1 2
3 0 4 5 6 1 2
จัดเรียงอาเรย์และบันทึกดัชนีต้นฉบับ ได้การเรียงสับหนึ่งอัน หากมีองค์ประกอบติดกันเท่ากัน สลับกันเพื่อได้อีกอัน
อัลกอริทึม
START Step 1 -> Declare Function void indice(int n, pairarray[]) Loop For int i=0; i Declare Function void permutation(int n, int a[], int k) Use STL pair arr[n] Loop for int i=0; i In main() Declare array a[]={2,5,6,2,2,2,2} Declare int n= sizeof(a)/sizeof(a[0]) Declare int k=4 Call permutation(n,a,k) STOP
ตัวอย่างโค้ด C++
#includeusing namespace std; void indice(int n, pair array[]){ for (int i = 0; i < n; i++) cout << array[i].second << " "; cout << endl; } void permutation(int n, int a[], int k){ pair arr[n]; for (int i = 0; i < n; i++){ arr[i].first = a[i]; arr[i].second = i; } sort(arr, arr + n); int count = 1; for (int i = 1; i < n; i++) if (arr[i].first == arr[i - 1].first) count++; if (count < k){ cout << "-1"; return; } for (int i = 0; i < k - 1; i++){ indice(n, arr); for (int j = 1; j < n; j++){ if (arr[j].first == arr[j - 1].first){ swap(arr[j], arr[j - 1]); break; } } } indice(n, arr); } int main(){ int a[] ={2,5,6,2,2,2,2}; int n = sizeof(a) / sizeof(a[0]); int k = 4; permutation(n, a, k); return 0; }
ผลลัพธ์
การรันโปรแกรมจะได้ผลลัพธ์ดังนี้:
0 3 4 5 6 1 2 3 0 4 5 6 1 2 0 3 4 5 6 1 2 3 0 4 5 6 1 2