package com.fishercoder.solutions;

/**
 * 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:

 The number at the ith position is divisible by i.
 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:
 N is a positive integer and will not exceed 15.
 */
public class _526 {
    //A good post to look at: https://discuss.leetcode.com/topic/79916/java-solution-backtracking and it's generic template afterwards for backtracking problems

    int count = 0;

    public int countArrangement(int N) {
        backtracking(N, new int[N + 1], 1);
        return count;
    }

    private void backtracking(int N, int[] used, int pos) {
        if (pos > N) {
            count++;
            return;
        }
        for (int i = 1; i <= N; i++) {
            if (used[i] == 0 && (i % pos == 0 || pos % i == 0)) {
                used[i] = 1;
                backtracking(N, used, pos + 1);
                used[i] = 0;
            }
        }
    }

}

package com.fishercoder.solutions;

/**
 * 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:

 The number at the ith position is divisible by i.
 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:
 N is a positive integer and will not exceed 15.
 */
public class _526 {
	/**A good post to look at: https://discuss.leetcode.com/topic/79916/java-solution-backtracking
	 * and there's a generic template afterwards for backtracking problems*/

	int count = 0;

	public int countArrangement(int N) {
		backtracking(N, new int[N + 1], 1);
		return count;
	}

	private void backtracking(int N, int[] used, int pos) {
		if (pos > N) {
			count++;
			return;
		}
		for (int i = 1; i <= N; i++) {
			if (used[i] == 0 && (i % pos == 0 || pos % i == 0)) {
				used[i] = 1;
				backtracking(N, used, pos + 1);
				used[i] = 0;
			}
		}
	}

}

refactor for format