用Java实现一些常见的问题
八皇后
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实现一些常见的问题的更多相关文章
- Java 中最常见的 5 个错误
在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 【转】Java 枚举7常见种用法
原文网址:http://softbeta.iteye.com/blog/1185573 Java 枚举7常见种用法 博客分类: java java枚举enmu 原创地址:http://blog.li ...
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 2、Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)
2.Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅. 1)SQLite Class.forNa ...
- Java web中常见编码乱码问题(二)
根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析: 2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...
- java项目中常见的异常及处理
Java开发中常见异常及处理方法 1.JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API ...
- Java基础-数组常见排序方式
Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...
- day11<Java开发工具&常见对象>
Java开发工具(常见开发工具介绍) Java开发工具(Eclipse中HelloWorld案例以及汉化) Java开发工具(Eclipse的视窗和视图概述) Java开发工具(Eclipse工作空间 ...
- Java避坑宝典《Java业务开发常见错误100例》上线了
写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
随机推荐
- 【InteillJ IDEA】Git的安装+同步项目到GitHub上
需要的工具: 1.InteillJ IDEA 2.Git 3.GitHub帐号 步骤: 1.下载Git 下载地址:https://git-scm.com/downloads 安装完成后 勾选Launc ...
- springBoot框架的一些概念
Spring的发展史1. Spring1.x 时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml ...
- javascript前端三层,字面量,变量,语句(if,switch,三元运算符,for,do while等)
1:前端三层: 结构层 HTML 样式层 CSS 行为层 JavaScript 2:JavaScript语句和语句之间的换行.空格.缩进都不敏感.alert("你");alert ...
- @import url(../image/css)的用法
1.@import url(../image/css);可以加载css文件2.@import url(../image/css);可以写在html里加载css文件,也可以写在css文件里加载css文件 ...
- 处理 WebService 中的 Map 对象
最近,我们讨论了关于 WebService 的相关问题.目前在 Smart 中,可发布两种类型的 WebService,它们是:SOAP 服务 与 REST 服务,您可以根据需要自由选择. 今天,我要 ...
- vue2 router-link to
<template> <div> <nv-header></nv-header> <div class="artlist"&g ...
- IOS Appstore价格表
- 几个opengl立方体绘制案例
VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...
- HBase源代码分析之MemStore的flush发起时机、推断条件等详情(二)
在<HBase源代码分析之MemStore的flush发起时机.推断条件等详情>一文中,我们具体介绍了MemStore flush的发起时机.推断条件等详情.主要是两类操作.一是会引起Me ...
- Python手势识别与控制
代码地址如下:http://www.demodashi.com/demo/12968.html Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenC ...