n皇后问题:
请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个n*n的棋盘上放置n个棋子,
使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。
给定一个int n,请返回方法数,保证n小于等于15
样例:
输入
4
输出
2
思路:
每个格子所在位置的每一行每一列,正对角线和反对角线都不允许存在元素。
递归每一行,循环每一列尝试在某列上放一个皇后,检验是否冲突,如果没有则标记,并继续寻找下一行。
出口,如果行等于n,计数加1,return。
1 import java.util.Scanner; 2 3 public class Seven_15回溯和剪枝n皇后问题 { 4 static int count; 5 static int n; 6 static int[] res; 7 8 //row 当前正在处理的行 9 public static void dfs(int row){ 10 if(row == n){ 11 count++; 12 return; 13 } 14 //依次尝试在某列上放一个皇后 15 for(int col = 0; col < n; col++){ 16 boolean ok = true; 17 //检验这个皇后是否和之前已经防止的皇后有冲突 18 for(int i = 0; i < row; i++){ 19 if(res[i] == col || i-res[i] == row-col || i+res[i] == row+col){ 20 ok = false; 21 break; 22 } 23 } 24 /*=======这里可以认为是剪枝=======*/ 25 //这一行的这一列可以放 26 if(ok){ 27 res[row] = col; //标记 28 dfs(row+1); //继续找下一行 29 30 } 31 } 32 } 33 34 public static void main(String[] args) { 35 Scanner in = new Scanner(System.in); 36 n = in.nextInt(); 37 38 res = new int[n]; 39 dfs(0); 40 System.out.println(count); 41 } 42 }