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,此代码运行速度也不是很快,如果有提高效率的方法或者具体的细节也欢迎来交流。本文仅提供一种解决思路。