N皇后问题递归加回溯
N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击。
给出一个整数n,返回n皇后问题的所有摆放方案
例如输入4
返回[↵ [".Q..", ↵ "...Q",↵ "Q...",↵ "..Q."],↵↵ ["..Q.", ↵ "Q...",↵ "...Q",↵ ".Q.."]↵]
import java.util.*;
public class Solution {
public ArrayList<String[]> solveNQueens(int n) {
ArrayList<String[]> result = new ArrayList<String[]>();
//存放每个皇后的位置,索引为第几排,值为放在第几个位置
int[] queen = new int[n];
helper(n, 0, result, queen);
return result;
}
private void helper(int n, int rowNum, ArrayList<String[]> result, int[] queen) {
//说明走通了存储题目要求格式
if (rowNum == n) {
ArrayList<String> oneResult = new ArrayList<String>();
// Current chess board is valid
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder(n);
int tmp = n;
while (tmp > 0) {
sb.append(".");
tmp--;
}
int column = queen[i];
sb.replace(column, column + 1, "Q");
oneResult.add(sb.toString());
}
String[] answer=new String[oneResult.size()];
int index=0;
for(String line : oneResult)
answer[index++]=line;
result.add(answer);
return;
}
//在这里进行回溯加递归,为社么赋值了没有赋回原值是因为有了rowNum这个进行到了第几行,以前赋的值直接会被覆盖
for (int i = 0; i < n; i++) {
queen[rowNum] = i;
if (check(rowNum, queen))
helper(n, rowNum + 1, result, queen);
}
}
//判断是否满足冲突条件
private boolean check(int rowNum, int[] queen) {
int colNum = queen[rowNum];
for (int i = 0; i < rowNum; i++) {
if (queen[i] == colNum || (queen[i] + i == colNum + rowNum) || (queen[i] - i == colNum - rowNum))
return false;
}
return true;
}
}
京公网安备 11010502036488号