LeetCode: NQueens
n皇后问题。用的是back tracking以及递归的方法。这个算法的时间复杂度为O(n^2).
首先确定第一行的皇后放在什么位置。(需要遍历这个皇后所有可以放的位置)。就是说第一个皇后可以在第一行的任一位置。
然后遍历第二行的皇后放在哪个位置,如果满足条件就接着放第三个,否则移到下一位置。。。以此类推
当放置完最后一个时,返回结果。
注意的问题是ArrayList是引用传递,所以可以把所有值都加在里面。
1 public ArrayList<String[]> solveNQueens(int n) { 2 int[] result = new int[n]; 3 ArrayList<String[]> a = new ArrayList<String[]>(); 4 generate(result, 0, a); 5 return a; 6 7 } 8 public void generate(int[] result, int N, ArrayList<String[]> a) { 9 if (result.length == N) { 10 a.add(print(result)); 11 } 12 else { 13 for (int i=0; i<result.length; i++) { 14 result[N] = i; 15 if (isConsistent(result, N)) 16 generate(result, N+1, a); 17 } 18 } 19 } 20 21 public String[] print(int[] result) { 22 String[] w = new String[result.length]; 23 for (int i=0; i<w.length; i++) w[i] = ""; 24 for (int i=0; i<result.length; i++) { 25 for (int j=0; j<result.length; j++) { 26 if(j == result[i]) { 27 w[i] = w[i] + "Q"; 28 } 29 else { 30 w[i] = w[i] + "."; 31 } 32 } 33 } 34 return w; 35 } 36 37 public boolean isConsistent(int[] result, int N) { 38 for (int i=0; i<N; i++) { 39 if(result[N] == result[i]) return false; 40 if(result[N] - result[i] == N - i) return false; 41 if(result[N] - result[i] == i - N) return false; 42 } 43 return true; 44 }
NQueens II
返回所有解法的数量。
还是上面的方法。
注意问题是,上面可以用ArrayList引用传递记录每个值,这里不能用int或Integer进行引用传递,所以只能用函数返回值的形式。
1 public int totalNQueens(int n) { 2 int[] result = new int[n]; 3 int a = 0; 4 a = generate(result, 0); 5 return a; 6 7 } 8 public int generate(int[] result, int N) { 9 int res = 0; 10 if (result.length == N) { 11 return 1; 12 } 13 else { 14 for (int i=0; i<result.length; i++) { 15 result[N] = i; 16 if (isConsistent(result, N)) 17 res += generate(result, N+1); 18 } 19 } 20 return res; 21 } 22 23 public boolean isConsistent(int[] result, int N) { 24 for (int i=0; i<N; i++) { 25 if(result[N] == result[i]) return false; 26 if(result[N] - result[i] == N - i) return false; 27 if(result[N] - result[i] == i - N) return false; 28 } 29 return true; 30 }