极限编程,最强N皇后JAVA解题代码,4秒出15皇后,33秒出16皇后
私人博客原文链接来自:http://www.hexcode.cn/article/show/eight-queen
8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现
8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
这几天,准确来说是连续4天了
真的能称之为极限编程了
关于N皇后算法的极限挑战,最终很满意
代码使用了“一维棋盘”,“对称剪枝”,“递归回溯”,“多线程”等特色
最终结果:
15皇后,用时:4903毫秒,计算结果:2279184
16皇后,用时:33265毫秒,计算结果:14772512
17皇后,用时:267460毫秒,计算结果:95815104
比起我第一天写N皇后,14皇后用时87秒的成绩,提高太多了!!!
说好的一定要在100秒内解16皇后,终于解脱了
啥都不说了,贴上代码和运算成绩
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
 | 
package com.newflypig.eightqueen;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class EightQueen7 {    private static final short K=8;     //使用常量来定义,方便之后解N皇后问题    private static short N=0;         public static void main(String[] args) throws Exception {        for(N=9;N<=17;N++){            long count=0;            Date begin =new Date();            /**             * 初始化棋盘,使用一维数组存放棋盘信息             * chess[n]=X:表示第n行X列有一个皇后             */                         List<short[]> chessList=new ArrayList<short[]>(N);            for(short i=0;i<N;i++){                short chess[]=new short[N];                chess[0]=i;                chessList.add(chess);            }                         short taskSize =(short)( N/2+(N%2==1?1:0) );            // 创建一个线程池            ExecutorService pool = Executors.newFixedThreadPool(taskSize);            // 创建多个有返回值的任务            List<Future<Long>> futureList = new ArrayList<Future<Long>>(taskSize);            for (int i = 0; i < taskSize; i++) {                Callable<Long> c = new EightQueenThread(chessList.get(i));                // 执行任务并获取Future对象                Future<Long> f = pool.submit(c);                futureList.add(f);            }            // 关闭线程池            pool.shutdown();                         for(short i=0; i<(short) (taskSize - (N%2==1?1:0)); i++){                              count+=futureList.get(i).get();            }            count=count*2;            if(N%2==1)                count+=futureList.get(N/2).get();                         Date end =new Date();            System.out.println("解决 " +N+ "皇后问题,用时:" +String.valueOf(end.getTime()-begin.getTime())+ "毫秒,计算结果:"+count);        }    }}class EightQueenThread implements Callable<Long>{    private short[] chess;    private short N;         public EightQueenThread(short[] chess){        this.chess=chess;        this.N=(short) chess.length;    }              @Override    public Long call() throws Exception {        return putQueenAtRow(chess, (short)1) ;    }    private Long putQueenAtRow(short[] chess, short row) {        if(row==N){            return (long) 1;        }                 short[] chessTemp=chess.clone();        long sum=0;        /**         * 向这一行的每一个位置尝试排放皇后         * 然后检测状态,如果安全则继续执行递归函数摆放下一行皇后         */        for(short i=0;i<N;i++){            //摆放这一行的皇后            chessTemp[row]=i;                         if( isSafety( chessTemp,row,i) ){                sum+=putQueenAtRow(chessTemp,(short) (row+1));            }        }                 return sum;    }         private static boolean isSafety(short[] chess,short row,short col) {        //判断中上、左上、右上是否安全        short step=1;        for(short i=(short) (row-1);i>=0;i--){            if(chess[i]==col)   //中上                return false;            if(chess[i]==col-step)  //左上                return false;            if(chess[i]==col+step)  //右上                return false;                         step++;        }                 return true;    }} | 

这是四天前的成绩:

确实有了很大的提升!
极限编程,最强N皇后JAVA解题代码,4秒出15皇后,33秒出16皇后的更多相关文章
- CCF 201612-2 工资计算 java 解题
		
问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...
 - FastDFS搭建及java整合代码【转】
		
FastDFS软件介绍 1.什么是FastDFS FastDFS是用C语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高 ...
 - java集合框架之java HashMap代码解析
		
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
 - 杭电HDOJ--ACM1002(JAVA解题,运用BigInteger)(自定义MBigInteger 简单实现大数处理----完善后可以实现百亿计算器)
		
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5501901.html JAVA解题: import java.util.*; import java. ...
 - 用java具体代码实现分数(即有理数)四则运算
		
用java具体代码实现分数(即有理数)四则运算 1,背景 Java老师布置了一个关于有理数运算的题目,因为参考书上有基本代码,所以自己主要是对书上代码做了一点优化,使其用户交互性更加友好以及代码封装性 ...
 - pagebean pagetag   java 后台代码实现分页 demo   前台标签分页 后台java分页
		
java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...
 - 经典KMP算法C++与Java实现代码
		
前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...
 - 常用 Java 静态代码分析工具的分析与比较
		
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
 - 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
		
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
 
随机推荐
- FullPage.js全屏滚动插件学习总结
			
如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面(查看),QQ浏览器的官网站.如果 ...
 - javascript设计模式--备忘录模式(Memento)
			
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Python Tricks 若干
			
赵斌 - APRIL 29, 2015 在 python 代码中可以看到一些常见的 trick,在这里做一个简单的小结. json 字符串格式化 在开发 web 应用的时候经常会用到 json 字符串 ...
 - java 驼峰命名
			
jstl中前台jsp页面调用对象中的属性时, 用的是小驼峰命名法. 例如:${item.createTime} 1.小驼峰式命名法(lower camel case): 第一个单字以小写字母开始,第二 ...
 - javascript中onclick事件能调用多个方法吗
			
Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了
 - Js之DOM(一)
			
----------------------------------------------------------------------------------------------第一部分 D ...
 - lintcode: 左填充
			
题目 实现一个leftpad库,如果不知道什么是leftpad可以看样例 样例 leftpad("foo", 5) >> " foo" leftpa ...
 - lintcode:买卖股票的最佳时机 II
			
买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...
 - Java多线程-线程的调度(守护线程)
			
本文转自http://www.cnblogs.com/linjiqin/p/3210004.html 感谢作者 守护线程与普通线程写法上基本没啥区别,调用线程对象的方法setDaemon(true), ...
 - CentOS系统安装tomcat
			
按照以下步骤操作即可wget http://mirrors.noc.im/apache/tomcat/tomcat-9/v9.0.0.M6/bin/apache-tomcat-9.0.0.M6.tar ...