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
广告