7.15回溯和剪枝_n皇后问题

思路:
每个格子所在位置的每一行每一列,正对角线和反对角线都不允许存在元素。
递归每一行,循环每一列尝试在某列上放一个皇后,检验是否冲突,如果没有则标记,并继续寻找下一行。
出口,如果行等于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 }

猜你喜欢

转载自www.cnblogs.com/z1110/p/12620540.html
今日推荐