zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    TechRoad_oneStep_0410
    Tech road one step
    TechRoad--oneStep--0327
    TechRoad_oneStep 0313
    Tech road one step
    Tech road one step
    Tech road one step
    Tech road one step
    Tech road one step
    Tech road one step
  • 原文地址:https://www.cnblogs.com/z1110/p/12620540.html
Copyright © 2011-2022 走看看