Leetcode 51. N-Queens

不定期更新leetcode解题java答案。

采用pick one的方式选择题目。

本题的意思是采用国际象棋的方式添加棋子“后”,使之相互间不在自己的攻击范围内。“后”的攻击方式为横方向、纵方向以及斜方向均可攻击。

使用傻瓜式方法,逐行进行尝试,循环,回溯。得出最后可能出现的结果。直接上代码:

 1 public class Solution {
 2     public List<List<String>> solveNQueens(int n) {
 3         List<List<String>> result = new ArrayList();
 4         
 5         StringBuilder sb = new StringBuilder();
 6         for(int i = 0; i < n; i++)
 7             sb.append(",");
 8         String init = sb.toString();
 9         
10         Queue<List<String>> q = new LinkedList();
11         //initialize first line
12         for(int i = 0; i < n; i++){
13             List<String> list = new ArrayList();
14             for(int j = 0; j < n; j++)
15                 list.add(j == 0 ? addQueen(i, n) : init);
16             attackPlace(list, 0, n);
17             q.offer(list);
18         }
19         //add queen to each line except first line
20         for(int i = 1; i < n; i++){
21             int size = q.size();
22             for(int j = 0; j < size; j++){
23                 List<String> list = q.poll();
24                 for(int k = 0; k < n; k++){
25                     if(list.get(i).charAt(k) != '.'){
26                         List<String> tmp = new ArrayList();
27                         for(int s = 0; s < n; s++)
28                             tmp.add(list.get(s));
29                         tmp.set(i, addQueen(k, n));
30                         attackPlace(tmp, i, n);
31                         q.offer(tmp);
32                     }
33                 }
34             }
35         }
36         
37         int size = q.size();
38         for(int i = 0; i < size; i++)
39             result.add(q.poll());
40         return result;
41     }
42     
43     public void attackPlace(List<String> list, int line, int size){
44         int loc = list.get(line).indexOf("Q");
45         
46         for(int i = line + 1; i < size; i++){
47             StringBuilder str = new StringBuilder(list.get(i));
48             if(loc + i - line < size)
49                 str.replace(loc + i - line, loc + i - line + 1, ".");
50             if(loc - i + line >= 0)
51                 str.replace(loc - i + line, loc - i + line + 1, ".");
52             str.replace(loc, loc + 1, ".");
53             list.set(i, str.toString());
54         }
55     }
56     
57     public String addQueen(int loc, int size){
58         StringBuilder str = new StringBuilder();
59         for(int s = 0; s < size; s++)
60             if(s == loc)
61                 str.append("Q");
62             else
63                 str.append(".");
64         return str.toString();
65     }
66 }

初始以“,”视为可放置“后”的位置,在每放置一个“后”对后面“,”使用题目要求“.”进行替换。函数attackPlace进行此操作。

addQueen函数单纯的是在添加一个“后”将此行的所有位置视为不可添加的符号替换,稍微提高点运行的速度。

由于本人对效率研究不是很多,最初的提交都是TLE,此代码运行速度也不是很快,如果有提高效率的方法或者具体的细节也欢迎来交流。本文仅提供一种解决思路。

posted @ 2016-06-06 16:07  zslhq~  阅读(480)  评论(0编辑  收藏  举报