7.15回溯和剪枝_n皇后问题

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 }
原文地址:https://www.cnblogs.com/z1110/p/12620540.html