美文网首页
回朔法--解决N后问题

回朔法--解决N后问题

作者: cp_insist | 来源:发表于2016-11-25 17:10 被阅读0次

引言:下午复习算法时,越看越没有信心,尤其是在看到比较抽象的舍伍德算法。感觉看了半天都还没有弄明白该算法的意义在哪?更别谈怎么用,都准备放弃了,想象放弃等于今天下午又什么事都没有做,于是将舍伍德算法先放下,继续后面的复习,看到拉斯维加斯和回朔法一起求解N后问题;开始提及该算法时,真的是挺恐惧的,但真正自己讲代码敲下来之后,瞬间思路清晰了许多;下面将具体的求解过程做如下笔记,方便以后复习:
一:问题描述:

二:解决办法:
直接上代码:

package Nquene;

/**
 * 使用回朔法求解N后问题
 * @author 陈鹏
 *
 */
public class huishuo {
    private static int[][] cheese;
    private static final int N = 8;
    public static int count = 0;
    /**
     * 初始化棋盘
     */
    public huishuo(){
        cheese = new int[N][N];
        for(int i =0 ;i<N;i++){
            for(int j = 0;j<N;j++){
                cheese[i][j] = 0;
            }
        }
    }
    public static void putQueenAtRow(int row,int[][] cheese){
        /**
         * 递归终止条件
         * 如果N等于8
         * 表示已经找到了合适的棋盘位置 
         */
        if(N==row){
            count++;
            System.out.println("找到"+count+"合适的解了");
            
            for(int i =0 ;i<N;i++){
                for(int j = 0;j<N;j++){
                    System.out.print(cheese[i][j]+"  ");
                }
                System.out.println();
            }
            return;
        }
        //临时数组:clone只是在克隆引用;
        int[][] temp = cheese.clone();
        for(int i=0;i<N;i++){
            //安全起见:每次放置第N行数据之前先将该行数据清空;
            for(int j=0;j<N;j++){
                temp[row][j] = 0;
            }
            temp[row][i] = 1;
            if(isSafety(temp,row,i)){
                putQueenAtRow(row+1,temp);
            }
        }
        
    }
    /**
     * 判断我们将要放置皇后的位置是否安全;
     * @param arr 临时棋盘
     * @param row 行数
     * @param col 列数
     * @return
     */
    public static boolean isSafety(int[][] arr,int row,int col){
        //初始步伐为1;
        int step = 1;
        //终止条件为判断到第一行时
        while(row-step>=0){
            //判断直上方
            if(arr[row-step][col]==1){
                return false;
            }
            //判断左上方:注意等号:=表示相邻
            if(col-step>=0 && arr[row-step][col-step]==1){
                return false;
            }
            //判断右上方:注意不要等号;
            if(col+step<N && arr[row-step][col+step]==1){
                return false;
            }
            step++;
        }
        
        return true;
    }
    public static void main(String[] args) {
        huishuo temp = new huishuo();
        huishuo.putQueenAtRow(0,cheese);
    }
}

相关文章

  • 回朔法--解决N后问题

    引言:下午复习算法时,越看越没有信心,尤其是在看到比较抽象的舍伍德算法。感觉看了半天都还没有弄明白该算法的意义在哪...

  • 算法设计与分析|5个算法

    1)分治法 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小),则直接解决;否则将其分解为k个规模...

  • iOS8.3使用\n换行问题

    关键代码: //8.3在\n后加空格解决换行不显示问题

  • 2018-08-10

    回溯法之n后问题 问题描述 在n x n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之...

  • 第4章 减治法

    减治法 基本思想:将规模为n的问题递减为规模为n-1(减常数)或n/2(减因子)的子问题,反复递减后对子问题求解,...

  • N皇后

    回溯法核心代码: n皇后问题回溯法

  • 回溯算法总结

    回溯法,⼀般可以解决如下⼏种问题: 组合问题:N个数⾥⾯按⼀定规则找出k个数的集合 切割问题:⼀个字符串按⼀定规则...

  • 分治算法

    分治法 1.什么是分治算法? 将原问题划分成n个小规模的问题,并且这些小规模问题与原问题结构相似,递归去解决这些子...

  • [蓝桥杯]用筛法求之N内的素数

    问题 1084: 用筛法求之N内的素数。 时间限制: 1Sec 内存限制: 64MB 提交: 8861 解决: 5...

  • 全网最好的数据结构学习文章合集系列之时间复杂度

    一、时间复杂度 O(n)时间解决的面试题:名人问题 O(n)时间解决的面试题:下雨积水量问题 O(n)时间解决的面...

网友评论

      本文标题:回朔法--解决N后问题

      本文链接:https://www.haomeiwen.com/subject/xmhwpttx.html