重新排列前 N 个数字,使它们在 C++ 中的距离为 K

我们给定了整数变量,比方说,N 和 K。任务是首先计算 N 的排列,然后重新排列排列,使其与每个元素的距离为 K。

让我们看看这个的各种输入输出场景 -

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

输出 - 在 K 距离处重新排列前 N 个数字是: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'。

  • Rearrangement(int n, int k)通过将 N 和 K 作为参数传递给函数来调用函数。

  • 函数内部 Rearrangement(int n, int k)

    • 将整数变量声明为 temp 并使用 n % (2 * k) 对其进行设置。

    • 将整数类型数组声明为大小为 n + 1 的 ptr,即 prt[n+1]。

    • 检查 IF k = 0 然后开始循环 FOR 从 i 到 1 直到 i 小于 size 并将 i 增加 1 并打印 i。

    • 检查 IF temp 不等于 0 然后打印 NOT POSSIBLE。

    • 从 i 到 1 开始循环 FOR 直到 i 小于 N 并将 ptr[i] 设置为 i。

    • 从 i 到 1 开始循环 FOR,直到 i 小于 n 并用 i + 2 * k 设置 i。在循环内,从 j 到 1 开始另一个循环 FOR,直到 j 小于 k 并将 j 增加 1。在循环内,通过传递 ptr[i + j -1] 和 ptr[k + i + j 调用 swa 方法- 1] 作为参数。

    • 开始循环 FOR 从 i 到 1 tll i 小于 N 并将 i 增加 1。

    • 打印 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<<"使它们在 K 距离处的前 N ​​个数字的重新排列是: ";
   Rearrangement(n, k);
   return 0;
}
输出结果

如果我们运行上面的代码,它将生成以下输出

使它们在 K 距离处的前 N ​​个数字的重新排列是: 3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 19 20 17 18

猜你喜欢