用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种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...
随机推荐
- Docker实践2:安装Docker及weblogic镜像
安装Docker 以root登录,运行 vi /etc/yum.repos.d/public-yum-ol6.repo,添加如下段落 [ol6_addons]name=Oracle Linux $re ...
- servlet之request和response的使用区分
有的时候在写servlet程序时,我总是被一个方法该用request去调用.还是用response去调用而困惑.从而造成编程时间的延长. 我在区分request和response的使用时,使用的方法是 ...
- Java程序员到架构师的推荐阅读书籍
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- solr curl索引 CSV/Json/xml文件
在windows系统中,用curl命令工具索引文件命令: 启动solr 在solr-6.6.0\bin的同级目录下的文件夹ImportData下要索引的文件. 1.索引 json文件 curl &qu ...
- hdu5289 Assignment (区间查询最大值最小值,st算法...)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:给定长度为n的序列a和一个整数K,找出最大值和最小值的差值小于K的区间.输出满足条件的区间的个 ...
- odoo8编辑视图中sheet边距过宽问题调整
在Odoo8的Form视图中,预设有一个sheet的边距,这样看起来像是在一页纸上录入信息,但因为现在的显示器比较宽,预设的sheet宽度比较小,这样看起来就浪费了大量的空间,尤其是明细字段比较多的时 ...
- sklearn-GBDT 调参
1. scikit-learn GBDT类库概述 在sacikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegre ...
- 【ODPS】UDF基础
UDF全称User Defined Function,即用户自己定义函数.ODPS提供了非常多内建函数来满足用户的计算需求,同一时候用户还能够通过创建自己定义函数来满足 不同的计算需求. UDF ...
- Android WebView学习
Android WebView学习 文章来源:小小懒羊羊个人知识管理库 权限: <uses-permission android:name="android.permission.IN ...
- Atitit. Ati IDE 开发平台的第一版规划
Atitit. Ati IDE 开发平台的第一版规划 1. 增加业务类型复杂类型内置1 1.1. 简单类型string int float自动类型转换以及2 1.2. $变量str连接2 2. Dsl ...