C++ 中的优美排列

c++server side programmingprogramming更新于 2024/9/1 3:09:00

假设我们有 N 个从 1 到 N 的整数。如果以下条件之一对于此数组中的第 i 个位置 (1 <= i <= N) 为真,我们将把优美排列定义为完全由这 N 个数字构成的数组 −

  • 第 i 个位置的数字可以被 i 整除。
  • i 可以被第 i 个位置的数字整除。

因此,如果输入为 2,则结果也将为 2,因为第一个优美排列是 [1,2]。这里第 1 个位置 (i=1) 的数字为 1,1 可以被 i 整除 (i=1)。然后第 2 个位置 (i=2) 的数字为 2,2 可以被 i 整除 (i=2)。第二个漂亮的排列是 [2, 1]:这里第一个位置(i=1)的数字是 2,2 可以被 i(i=1)整除。然后第二个位置(i=2)的数字是 1,i(i=2)可以被 1 整除。

为了解决这个问题,我们将遵循以下步骤 −

  • 定义一个递归方法solve(),它将接受访问过的数组、end 和 pos。 pos 最初为 1。
  • 如果 pos = end + 1,则将 ans 增加 1 并返回
  • 对于 i,范围从 1 到 end
    • 如果 i 未被访问且 pos 可被 0 整除或 i 可被 0 整除,则
      • 将 i 标记为已访问
      • solve(visited, end, pos + 1)
      • 将 i 标记为未访问
  • 从 main 方法中,执行以下操作 −
  • ans := 0,创建一个名为 accessed 的数组
  • call solve(visited, N, 1)r
  • return ans.

让我们看看下面的实现以便更好地理解 −

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int ans;
   void solve(vector <bool>& visited, int end, int pos = 1){
      if(pos == end + 1){
         ans++;
         return;
      }
      for(int i = 1; i <= end; i++){
         if(!visited[i] && (pos % i == 0 || i % pos == 0)){
            visited[i] = true;
            solve(visited, end, pos + 1);
            visited[i] = false;
         }
      }
   }
   int countArrangement(int N) {
      ans = 0;
      vector <bool> visited(N);
      solve(visited, N);
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.countArrangement(2));
}

输入

2

输出

2

相关文章