博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现...
阅读量:6414 次
发布时间:2019-06-23

本文共 3022 字,大约阅读时间需要 10 分钟。

接上一篇博客:

《》

是使用递归方法实现回溯算法的,在第一次使用二维矩阵的情况下,又做了一次改一维的优化

但是算法效率仍然差强人意,因为使用递归函数的缘故

下面提供另一种回溯算法的实现,使用数据结构”栈“来模拟,递归函数的手工实现,因为我们知道计算机在处理递归时的本质就是栈

时间复杂度是一样的,空间复杂度因为自定义了class,有所上升

经过测试其性能甚至低于上篇博客的递归实现

权当是使用数据结构”栈“,解决15皇后的代码如下:

 

package com.newflypig.eightqueen;import java.util.Date;import java.util.Stack;/** * 使用数据结构“栈”,模拟递归函数 * 实现非递归方案的回溯算法 * @author newflydd@189.cn * Time: 2015年12月31日 下午6:13:05 */public class EightQueen3 {    private static final short N=15;        public static void main(String[] args){        Date begin =new Date();                long count=0;        /**         *  初始化栈和棋盘,并向栈中压入第一张初始化的棋盘         */        Stack
stack=new Stack
(); short[] chessData=new short[N]; for(short i=1;i
N寻找第一个合法解,如果row达到边界count+1,否则push进栈 */ Chess chessTemp=chess.clone(); if(chessTemp.moveRow()){ while(chessTemp.moveCol()){ if( isSafety(chessTemp) ){ if( chessTemp.currentRow==N-1 ){ count++; continue; }else{ stack.push(chessTemp); continue EMPTY; } } } } } } Date end =new Date(); System.out.println("解决 " +N+ "皇后问题,用时:" +String.valueOf(end.getTime()-begin.getTime())+ "毫秒,计算结果:"+count); } private static boolean isSafety(Chess chess) { // 判断中上、左上、右上是否安全 short step = 1; for (short i = (short) (chess.currentRow - 1); i >= 0; i--) { if (chess.chess[i] == chess.currentCol) // 中上 return false; if (chess.chess[i] == chess.currentCol - step) // 左上 return false; if (chess.chess[i] == chess.currentCol + step) // 右上 return false; step++; } return true; }}class Chess implements Cloneable{ public short[] chess; //棋盘数据 public short currentRow=0; //当前行 public short currentCol=0; //当前列 public boolean visited=false; //是否访问过 public Chess(short[] chess){ this.chess=chess; } public boolean moveCol(){ this.currentCol++; if(this.currentCol>=chess.length) return false; else{ this.chess[currentRow]=currentCol; return true; } } public boolean moveRow(){ this.currentRow++; if(this.currentRow>=chess.length) return false; else return true; } public Chess clone() { short[] chessData=this.chess.clone(); Chess chess=new Chess(chessData); chess.currentCol=-1; chess.currentRow=this.currentRow; chess.visited=false; return chess; }}

 

执行结果:

 

 

博主会继续思考其他算法优化方案,直至100秒跑16皇后,OK?

 

转载于:https://www.cnblogs.com/newflydd/p/5093733.html

你可能感兴趣的文章
[2019.2.13]BZOJ4318 OSU!
查看>>
版本号带两个小数点的,如何比较大小?( NSStringCompareOptions )
查看>>
QCustomplot使用分享(三) 图
查看>>
什么是java?
查看>>
WPF路径动画(动态逆向动画)
查看>>
Low Level Reader Protocol (LLRP) 简介
查看>>
[Micropython]TPYBoard v10x NRF24L01无线通讯模块使用教程
查看>>
mysql中show processlist过滤和杀死线程
查看>>
最新Sublime Text 2 激活 汉化
查看>>
基础数据类型之字典
查看>>
第七次作业
查看>>
Oracle中NVARCHAR2与VARCHAR2的区别
查看>>
php debug
查看>>
Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】
查看>>
lvm实现快速备份文件及数据库,lvm快照原理
查看>>
设计模式之Factory Method(工厂方法)
查看>>
10K入职linux运维岗位小伙伴感谢信及面试经历分享
查看>>
zookeeper入门之Curator的使用之几种监听器的使用
查看>>
[转]Reporting Service部署之访问权限
查看>>
innerxml and outerxml
查看>>