八皇后

 public class EightQueen {

     private static final int ROW = 4;
private static final int COL = 4; private static int count = 0; // 八皇后的解的个数 private static boolean[][] maps = new boolean[ROW][COL]; // 初始化二维数组,模拟8*8棋盘,默认值是false表示没有皇后 // 如何去放皇后?
/**
* 放置第row行的皇后
* @param row 从第0行开始放皇后
*/
public static void putQueen(int row) { // 递归的出口
if (row == ROW) { // row=8时,已经到了第9行,那么前面的8行就是OK的
printQueen();
return;
} // 把皇后放到第row行的第j列
for (int j = 0; j < COL; j++) {
// 如果可以放,就将皇后放在该点
if (isOK(row, j)) {
maps[row][j] = true;
putQueen(row + 1); // 该行放好之后放下一行【递归去放皇后】,算法已经跳转
maps[row][j] = false; // 回溯,当放row+1行棋子不满足的时候,会回溯到第row行
}
}
} // 如果要将皇后放在(x,y)点,则需要先判断该点是否可以放
public static boolean isOK(int x, int y) { // 遍历二维数组,判断4个方向是否存在皇后
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
// 正斜边x-y定值,逆斜边x+y为定值
if (i == x || j == y || i - j == x - y || i + j == x + y) {
// 判断4个方向是否存在皇后
if (maps[i][j]) { // 如果该点放了一个皇后,则返回false
return false;
}
}
}
} return true;
} public static void printQueen() { System.out.println("第" + (++count) + "个解");
System.out.println("*******************");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (maps[i][j]) {
System.out.print("Q ");
} else {
System.out.print("* ");
}
}
System.out.println();
}
} /**
* 穷举法求4皇后
*/
private static void Queen(){ for(int i = 0;i < 4;++i)
for(int j = 0;j < 4;++j)
for(int k = 0;k < 4;++k)
for(int m = 0; m < 4;++m)
if (!conflusion(i,j,k,m)){
System.out.println("["+i+","+j+"," + k + "," + m +"]");
} } private static boolean conflusion(int i, int j, int k, int m) { return j == i || k == i || m == i || k == j || m == j || k == m
|| Math.abs(i - j) == 1 || Math.abs(i - k) == 2
|| Math.abs(i - m) == 3 || Math.abs(j - k) == 1
|| Math.abs(j - m) == 2 || Math.abs(k - m) == 1;
} public static void main(String[] args) { System.out.println("回溯法求解4皇后");
putQueen(0); // 从第0行开始放皇后
System.out.println("穷举法求解4皇后");
Queen();
}
}

用Java实现一些常见的问题的更多相关文章

  1. Java 中最常见的 5 个错误

    在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...

  2. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  3. 【转】Java 枚举7常见种用法

    原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu  原创地址:http://blog.li ...

  4. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  5. 2、Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

    2.Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅. 1)SQLite Class.forNa ...

  6. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  7. java项目中常见的异常及处理

    Java开发中常见异常及处理方法 1.JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API ...

  8. Java基础-数组常见排序方式

    Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...

  9. day11<Java开发工具&常见对象>

    Java开发工具(常见开发工具介绍) Java开发工具(Eclipse中HelloWorld案例以及汉化) Java开发工具(Eclipse的视窗和视图概述) Java开发工具(Eclipse工作空间 ...

  10. Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...

随机推荐

  1. Editplus格式化代码

    Editplus格式化代码插件(CSS,JS)今天在BlueIdea看到有人发了一篇名 为“让Editplus自动格式化css和js”的文章,看完后觉得写的很好,我也突然来了灵感,为什么不把前端开发常 ...

  2. Ado.Net基础拾遗二:插入,更新,删除数据

    插入数据 public void InsertDataToSQL() { string conStr = ConfigurationManager.ConnectionStrings["No ...

  3. http://www.oschina.net/code/snippet_12_13918

    http://www.oschina.net/code/snippet_12_13918

  4. 【转】es6的拓展运算符 spread ...

    原文:https://blog.csdn.net/qq_30100043/article/details/53391308 The rest parameter syntax allows us to ...

  5. Linux网络配置之虚拟网卡的配置(ubuntu 16.04)案例

    sudo vim /etc/network/interfaces 标红的名称一定要一致 sudo vim /etc/resolv.conf  配置外网的ip(默认可以不填,系统自己获取)

  6. javascript - 全局与局部作用域

    // 全局作用域 var globalNumber = 1; // 挂载在window上的变量或函数 -> 全局作用域 function InternalScope() { // 局部作用域 / ...

  7. Atitit避免出现空指针异常解决方案

    Atitit避免出现空指针异常解决方案 1. Null的问题1 2. 强制区分一般引用vs 可空引用 vs 强制引用,或者说非空引用2 3. ?运算符(问号运算符) !感叹号运算符避免出现空指针异常, ...

  8. Android中Intent传递类对象的方法一(Serializable)

    Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...

  9. cpu分析简介

    进程占用CPU过高,一般有以下两种原因:          1.    业务量过大导致进程处理负荷高,占用CPU资源:2.    程序BUG导致,比如死循环:    初步查看cpu占用情况top进一步 ...

  10. Nginx编译安装第三方模块http_substitutions_filter_module2222

    Nginx编译安装第三方模块http_substitutions_filter_module Rming -- 阅读 安装 Http 编译 module filter nginx 模块 >> ...