在 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 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告