最近一个项目刚刚结束,稍稍清闲了下来。其实我对自己的编程技术一直不太自信,作为程序员,在大学期间竟然都没选修过算法设计,真可谓三脚猫功夫。

正因如此,我反而一直保留着一本算法设计的书(数据结构,高数啥的大学毕业的那年遗忘在宿舍了 - -!),近来随手翻翻,找了个问题(nQueen)自己练手,用java实现之,请各位轻拍。

问题简单描述下:在n*n的棋盘上放置n个棋子(Queen)使得同一列,行,斜线上有且仅有一个Queen。更多该问题的背景可以百度之。

 
 1 /**
 2  * 请调用静态方法NQueen.calc(int n)方法计算n皇后问题
 3  * @author Lovememo
 4  *
 5  */
 6 public class NQueen {
 7     private int[][] chessBoard;
 8     private int succeedSum;      //记录解的个数
 9
10     private void setQueen(int m, int n, boolean flag) {
11         if(flag == true)
12             this.chessBoard[m][n] = 1;
13          else
14             this.chessBoard[m][n] = 0;
15     }
16
17     private boolean isSolution() {
18         int sum = 0;
19         for(int i=0; i<this.chessBoard.length; i++) {
20             for(int j=0; j<this.chessBoard.length; j++) {
21                 sum += this.chessBoard[i][j];
22             }
23         }
24         if(sum == this.chessBoard.length)
25             return true;
26         else
27             return false;
28     }
29
30     private boolean canBeQueen(int m, int n) {
31         for(int i=0; i<this.chessBoard.length; i++) {
32             for(int j=0; j<this.chessBoard.length; j++) {
33                 if(1 == this.chessBoard[i][j]) {
34                     //横坐标相同,纵坐标相同,或者在同一斜线上,则不能为Queen
35                     if(m==i || n==j || Math.abs(m-i) == Math.abs(n-j))
36                         return false;
37                 }
38             }
39         }
40         return true;
41     }
42
43     //递归回溯计算
44     private void calculate(int startNum) {
45         int chessBoardLength = this.chessBoard.length;
46         if(startNum == chessBoardLength-1) { //设置跳出递归条件
47             for(int i=0; i<chessBoardLength; i++) {
48                 if(this.canBeQueen(startNum, i)) {
49                     this.setQueen(startNum, i, true);
50                     if(this.isSolution()) {
51                         this.succeedSum += 1;
52                         this.printChess();
53                     }
54                     this.setQueen(startNum, i, false);
55                     return;
56                 }
57             }
58             return;
59         }
60
61         for(int i=0; i<chessBoardLength; i++) {
62             if(this.canBeQueen(startNum, i)) {
63                 this.setQueen(startNum, i, true);
64                 this.calculate(startNum + 1);
65                 this.setQueen(startNum, i, false);
66             }
67         }
68     }
69
70     //将n皇后问题的一个解打印出来
71     private void printChess() {
72         for(int i=0; i<this.chessBoard.length; i++) {
73             for(int j=0; j<this.chessBoard.length; j++) {
74                 System.out.print(this.chessBoard[i][j] + " ");
75             }
76             System.out.println();
77         }
78         System.out.println();
79     }
80
81     private NQueen(int n) {
82         this.chessBoard = new int[n][n];
83         this.succeedSum = 0;
84     }
85
86     public static void calc(int n) {
87         NQueen nq = new NQueen(n);
88         nq.calculate(0);
89         System.out.println(nq.succeedSum);
90     }
91
92     public static void main(String[] args) {
93         NQueen.calc(8);
94
95     }
96 }

转载于:https://www.cnblogs.com/lovememo/archive/2013/03/24/nQueen.html

nQueen问题java实现相关推荐

  1. N后问题详解(回溯法)--Java实现

    目录 一.问题描述 二.求解思路 三.代码实现 一.问题描述 N皇后问题:在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 二 ...

  2. java笔记(第一部分语法基础)

    java笔记 一. 计算机概述 1.1 计算机组成部分 1.2 人机交互方式 1.3 计算机语言 1.4 Java语言介绍 1.5 Java开发环境搭建 二.基本数据类型与运算 2.1 关键字 2.2 ...

  3. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  4. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  5. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  6. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  7. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  8. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  9. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid

    Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...

最新文章

  1. Tableau 必知必会之使用环境的配置需求
  2. 在IIS6上部署WebService
  3. 如何做好一条0~2岁的产品狗
  4. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
  5. Beginning iCloud in iOS 5 Tutorial Part 2(转载)
  6. 树形dp贪吃的九头龙(vijos1523)
  7. 理解数据库中的undo日志、redo日志、检查点
  8. 罗技驱动只能安装在c盘么?
  9. http-server基本使用
  10. mysql取第一行数据_select取第一行数据
  11. UPC-5094 - Faulty Robot - 搜索
  12. json模块错误:Expecting value: line 1 column 1 (char 0)
  13. 修复版拼团商城前端+后端微信小程序源码下载
  14. 【报告分享】2021小红书投放运营指南书-小红书(附下载)
  15. Java调用Python下载网页
  16. 简一论币:8.15 ETH多头大放异彩 BTC上行蠢蠢欲动
  17. 查看云主机是否有显卡,配置如何?
  18. HDU 5914 - Triangle
  19. python根据文本生成词云图
  20. Java中存取Rtf文件的程序

热门文章

  1. 针对Hybrid A*论文解析(5)中的方法的一些验证
  2. java后端技术路线_Java后端精选技术:Java的反射机制
  3. 人脸识别撞脸名画_艺术与时尚结合的极致——当服装设计遇到名画
  4. python参数估计置信区间_python中分布参数的置信区间估计
  5. linux搜索含多个字符串,关于linux:使用grep搜索多个字符串
  6. 在 Mac 上使用“网络实用工具”
  7. 远程桌面连接服务器,提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正
  8. oracle 提示存在lob,Oracle数据库出现ORA-19566 LOB坏块的处理记录
  9. list元素求和_LeetCode刷题实战82:删除排序链表中的重复元素 II
  10. 微信小程序中处理 获取用户地址的回调