leetcode hard模式专杀之51. N-Queens

xiaoxiao2021-02-28  76

继续leetcode hard模式, 八皇后问题的一般版,这种举一反三的题目值得好好琢磨,典型的回溯法,思路就不多说了,上代码,注意一一些边界条件的细节:

public class Solution { public List<String> transfer(int[] q){ List<String> result = new ArrayList<>(); for(int i = 0; i<q.length; i++){ StringBuilder sb = new StringBuilder(); for(int j=0; j<q.length; j++){ if(j==q[i]){ sb.append("Q"); }else{ sb.append("."); } } result.add(sb.toString()); } return result; } public List<List<String>> solveNQueens(int n) { List<List<String>> result = new ArrayList<>(); int[] q=new int[n]; for(int i = 0 ; i<n; i++){ enumerate(result, i, q, 0); } return result; } public boolean isConsistent(int[] q, int line, int index){ if(line==0){ return true; }else{ for(int i=0; i<line;i++){ //i行q[i]列 vs line行index列 if(q[i]==index){ //同列 return false; } if(index-q[i]==line-i){ return false; } if(index-q[i]==i-line){ return false; } } return true; } } public void enumerate(List<List<String>> result, int index, int[] q, int line){ if(line==q.length-1){ if(isConsistent(q, line, index)){ q[line] = index; result.add(transfer(q)); } }else if(line == 0){ q[line] = index; for(int j = 0; j<q.length; j++){ enumerate(result, j, q, line+1); } }else{ if(isConsistent(q, line, index)){ q[line] = index; for(int j = 0; j<q.length; j++){ enumerate(result, j, q, line+1); } } } } }

转载请注明原文地址: https://www.6miu.com/read-61066.html

最新回复(0)