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;
    }
}