สมมติว่าเรามีจำนวนเต็ม N และ K สองจำนวน เราต้องหาการเรียงสับเปลี่ยนของจำนวนธรรมชาติจำนวน 2N แรก เพื่อให้สมการต่อไปนี้เป็นจริง
$$\displaystyle\sum\limits_{i=1}^N\lvert A_{2i-1}-A_{2i}\rvert+\lvert \displaystyle\sum\limits_{i=1}^N A_{2i-1 }-A_{2i} \rvert=2K$$
ค่าของ K ควรน้อยกว่าหรือเท่ากับ N ตัวอย่างเช่น ถ้า N =4 และ K =1 ผลลัพธ์จะเป็น 2 1 3 4 ผลลัพธ์ของนิพจน์ที่กำหนดจะเป็น (|2 – 1| + | 3 – 4|) – (|2 – 1 + 3 – 4|) =2.
แนวคิดง่ายๆ ลองพิจารณาว่าเรามีลำดับการเรียงลำดับ เช่น 1, 2, 3, 4, 5, 6, …. หากเราสลับสองดัชนี 2i – 1 และ 2i ผลลัพธ์จะเพิ่มขึ้น 2 อย่างแน่นอน เราจำเป็นต้องทำการแลกเปลี่ยน K ดังกล่าว
ตัวอย่าง
#include<iostream> using namespace std; void showPermutations(int n, int k) { for (int i = 1; i <= n; i++) { int a = 2 * i - 1; int b = 2 * i; if (i <= k) cout << b << " " << a << " "; else cout << a << " " << b << " "; } } int main() { int n = 4, k = 2; showPermutations(n, k); }
ผลลัพธ์
2 1 4 3 5 6 7 8