在 C++ 中重新排列前 N 個數字,使它們之間距離為 K


給定整數變數 N 和 K。任務是首先計算 N 的排列,然後重新排列排列,使其每個元素都與其他元素相距 K 的距離。

讓我們看看這個各種輸入輸出場景:

輸入 - int n = 20, int k = 2

輸出 - 將前 N 個數字重新排列以使其距離為 K:3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 19 20 17 18。

解釋 - 給定整數變數 'N' 即 20 和 'K' 即 2。現在我們將計算 'N' 的排列,即 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20。現在,我們將以所有元素都與每個元素相距 'k' 的距離的方式排列這些元素。

輸入 - int n = 10, int k = 3

輸出 - 將前 N 個數字重新排列以使其距離為 K:不可能

解釋 - 給定整數變數 'N' 即 10 和 'K' 即 3。現在我們將計算 'N' 的排列,即 1, 2, 3, 4, 5, 6, 7, 8, 9, 10。現在,我們將以所有元素都與每個元素相距 'k' 的距離的方式排列這些元素,但對於給定的輸入值,這是不可能的。

下面程式中使用的演算法如下:

  • 輸入整數型別元素,即 'N' 和 'K'。

  • 透過將 N 和 K 作為引數傳遞給函式,呼叫函式 Rearrangement(int n, int k)。

  • 在函式 Rearrangement(int n, int k) 內部:

    • 宣告一個整數變數 temp 並將其設定為 n % (2 * k)。

    • 宣告一個大小為 n + 1 的整數型別陣列 ptr,即 prt[n+1]。

    • 檢查如果 k = 0,則從 i = 1 開始迴圈,直到 i 小於大小,並遞增 i,然後列印 i。

    • 檢查如果 temp 不等於 0,則列印“不可能”。

    • 從 i = 1 開始迴圈,直到 i 小於 N,並將 ptr[i] 設定為 i。

    • 從 i = 1 開始迴圈,直到 i 小於 n,並將 i 設定為 i + 2 * k。在迴圈內,從 j = 1 開始另一個迴圈,直到 j 小於 k,並遞增 j。在迴圈內,透過將 ptr[i + j -1] 和 ptr[k + i + j - 1] 作為引數傳遞給 swap 方法。

    • 從 i = 1 開始迴圈,直到 i 小於 N,並遞增 i。

    • 列印 prt[i]。

  • 列印結果。

示例

#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int n, int k){
   int temp = n % (2 * k);
   int ptr[n + 1];
   if(k == 0){
      for(int i = 1; i <= n; i++){
         cout << i << " ";
      }
      return;
   }
   if(temp != 0){
      cout<<"Not Possible";
      return;
   }
   for(int i = 1; i <= n; i++){
      ptr[i] = i;
   }
   for(int i = 1; i <= n; i += 2 * k){
      for(int j = 1; j <= k; j++){
         swap(ptr[i + j - 1], ptr[k + i + j - 1]);
      }
   }
   for(int i = 1; i <= n; i++){
      cout << ptr[i] << " ";
   }
}
int main(){
   int n = 20;
   int k = 2;
   cout<<"Rearrangement of first N numbers to make them at K distance is: ";
   Rearrangement(n, k);
   return 0;
}

輸出

如果我們執行以上程式碼,它將生成以下輸出

Rearrangement of first N numbers to make them at K distance is: 3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 19 20 17 18

更新於:2021年11月2日

92 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.