leetcode 526. Beautiful Arrangement

Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:

  1. The number at the ith position is divisible by i.
  2. i is divisible by the number at the ith position.

Now given N, how many beautiful arrangements can you construct?

Example 1:

Input: 2
Output: 2
Explanation: 

The first beautiful arrangement is [1, 2]:

Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).

Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).

The second beautiful arrangement is [2, 1]:

Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).

Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1.

Note:

  1. N is a positive integer and will not exceed 15.

基本题:回溯法。

解法一:开辟一个新的数组,标记是否访问过。

 1 class Solution {
 2     int cnt = 0;
 3 public:
 4     int countArrangement(int N) {
 5         vector<bool> visited(N + 1, false);
 6         calculate(N, visited, 1);
 7         return cnt;
 8     }
 9     void calculate(int N, vector<bool> &visited, int pos) {
10         if (pos > N) {
11             cnt++;
12             return;
13         }
14         for (int i = 1; i <= N; ++i) {
15             if (!visited[i] && ((pos % i == 0) || (i % pos == 0))) {
16                 visited[i] = true;
17                 calculate(N, visited, pos + 1);
18                 visited[i] = false;
19             } 
20         }
21     }
22 };

解法二:

原文地址:https://www.cnblogs.com/qinduanyinghua/p/11904517.html