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.."]
]

这里需要用到回溯(su)算法

回溯算法

1.定义一个解空间,即存放一个解的空间

2.开始遍历,DFS,如果没有一个合适的,回退上一步

这个还要多了解,多谢谢才okay

 1 public class Solution {
 2     int solution[];
 3     int num_queen;
 4     List<String[]>  result = new ArrayList<String[]>();
 5     
 6     public List<String[]> solveNQueens(int n) {
 7         solution = new int[n + 1];
 8         num_queen = n;
 9         placeQueen(1);
10         return result;
11     }
12     
13     /**放第n个皇后
14      * @param n
15      */
16     public void placeQueen(int n){
17         if(n > num_queen){
18             String temp[] = new String[num_queen];
19             String tempStr = "";
20             
21             for(int i = 1; i <= num_queen; i++){
22                 for(int j = 1; j <= num_queen; j++){
23                     if(j == solution[i])
24                         tempStr += "Q";
25                     else
26                         tempStr += ".";
27                 }
28                 temp[i - 1] = tempStr;
29                 tempStr = "";
30             }
31             result.add(temp);
32         }else{
33             for(int i = 1; i <= num_queen; i++){
34                 solution[n] = i;                            //将n个皇后放到i列
35                 if(isValid(n))                                //如果i列有效
36                     placeQueen(n + 1);                        //放下一个皇后
37             }
38         }
39     }
40     
41     /**
42      * 第k个皇后的位置是否有效
43      * @param k
44      * @return
45      */
46     public boolean isValid(int k){
47         for(int i = 1; i < k; i++){
48             if(solution[i] == solution[k] || Math.abs(i - k) == Math.abs(solution[i] - solution[k]))
49                 return false;
50         }
51         return true;
52     }
53     
54 }

 

posted on 2014-11-24 20:49  luckygxf  阅读(152)  评论(0编辑  收藏  举报

导航