题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
import java.util.*; public class Solution { /** * * @param n int整型 the n * @return int整型 */ int resNum = 0; public int Nqueen (int n) { // write code here // 用一个标记记录行号,每次从每一行中的每一列中选出一个位置,如果该位置符合条件 // 则选择放皇后(每行只可能有一个皇后),否则返回上一行,重新选择一列,如果最后选择到了最后一行也选择出了一个皇后,则此时 // 标记的行号等于矩阵的总行数,代表成功选择出一个方案,然后返回,重新选当前行是否还有适合的,没有就 // 返回上一行,重新选,没有就选择上一行这样子循环,直到返回到第一行,重新选择下一列(循环),然后判断是否适合放皇后 // 记录每个皇后的位置,利用一个一维数组,下标是行号,值是列号,代表一个皇后所在的位置 int[] queenPos = new int[n]; int row = 0; recursion(row, n, queenPos); return resNum; } public void recursion(int row, int n, int[] queenPos){ // 结束条件 if(row == n){ resNum++; return; } // 遍历每一行的每一列 for(int j=0; j<n; j++){ if(ifRightPos(row,j,queenPos)){ // 回退的时候会覆盖 queenPos[row] = j; recursion(row+1,n,queenPos); } } return; } // 用于判断某个位置是否是合理的位置可以放置皇后 public boolean ifRightPos(int row, int line, int[] queenPos){ // 遍历整个queenPos的每个皇后,判断当前传递过来的下标是否和这些皇后同行同列同斜线 for(int i=0; i<row; i++){ // 同行 同列 同斜线 if(row == i || line == queenPos[i] || Math.abs(row-i) == Math.abs(line-queenPos[i])){ return false; } } return true; } }