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 為未訪問
- 如果 i 未被訪問並且 pos 可以被 i 整除或 i 可以被 pos 整除,則
- 從主方法中執行以下操作:-
- 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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP