C++中的美麗排列


假設我們有 N 個從 1 到 N 的整數。我們將定義一個美麗的排列為一個數組,如果該陣列完全由這 N 個數字構成,並且對於該陣列中的第 i 個位置(1 <= i <= 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]:此處第 1 個位置(i=1)上的數字為 2,並且 2 可以被 i(i=1)整除。然後第 2 個位置(i=2)上的數字為 1,並且 i(i=2)可以被 1 整除。

為了解決這個問題,我們將遵循以下步驟:-

  • 定義一個遞迴方法 solve(),它將接收 visited 陣列、end 和 pos。pos 最初為 1。
  • 如果 pos = end + 1,則將 ans 加 1 並返回。
  • 對於 i 的範圍從 1 到 end
    • 如果 i 未被訪問並且 pos 可以被 i 整除或 i 可以被 pos 整除,則
      • 標記 i 為已訪問
      • solve(visited, end, pos + 1)
      • 標記 i 為未訪問
  • 從主方法中執行以下操作:-
  • ans := 0,建立一個名為 visited 的陣列
  • 呼叫 solve(visited, N, 1)
  • 返回 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

更新於: 2020年5月2日

811 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.