[leetcode]N-Queens

N-Queens

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

算法思路:
回溯算法,经典的八皇后问题,不多啰嗦,不明白的请戳这里

 1 public class Solution {
 2 List<String[]> result = new ArrayList<String[]>();
 3     public List<String[]> solveNQueens(int n) {
 4         if(n <= 0) return result;
 5         int[] hash = new int[n];
 6         dfs(hash,0,n);
 7         return result;
 8     }
 9     private void dfs(int[] hash,int row,int n){
10         if(row == n ){
11             String[] node = new String[n];
12             for(int i = 0; i < n; i++){
13                 StringBuilder sb = new StringBuilder();
14                 for(int j = 0; j < n;sb.append('.'),j++);
15                 sb.setCharAt(hash[i], 'Q');
16                 node[i] = sb.toString();
17             }
18             result.add(node);
19         }
20         for(int i = 0; i < n; i++){
21             if(!isConflict(hash, row, i)){
22                 hash[row] = i;
23                 dfs(hash, row + 1, n);
24                 hash[row] = 0;//track back
25             }
26         }
27     }
28     private boolean isConflict(int[] hash,int row,int column){
29         for(int i = 0; i < row; i++){
30             if(hash[i] == column) return true;
31             else if(i - hash[i] == row - column || hash[i] + i == row + column) return true;
32         }
33         return false;
34     }
35 }

 


posted on 2014-07-14 22:09  喵星人与汪星人  阅读(173)  评论(0编辑  收藏  举报