Beautiful Arrangement问题及解法

来源:互联网 发布:软件企业 编辑:程序博客网 时间:2024/05/24 02:37

问题描述:

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?

示例:

Input: 2Output: 2Explanation: 
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.
问题分析:

类似于求数组的排列问题,可用回溯法依次求解。


过程详见代码:

class Solution {public:    int countArrangement(int N) {if (!N) return 1;vector<bool> used(N, false);int res = 0;bs(used, N, res, 0);return res;}void bs(vector<bool>& used,int n,int& res,int count){if (count == n){res++;return;}for (int i = 0; i < n; i++){if (!used[i + 1] && ((i + 1) % (count + 1) == 0 || (count + 1) % (i + 1) == 0)){used[i + 1] = true;bs(used, n, res,count + 1);used[i + 1] = false;}}}};