n皇后问题java_经典n皇后问题java代码实现
问题描述:在n*n的二维表格,把n个皇后在表格上,要求同一行、同一列或同一斜线上不能有2个以上的皇后。
例如八皇后有92种解决方案,五皇后有10种解决方案。
public class TestQueen {
int n; //皇后的个数
int num = 0; // 记录方案数
int[] queenCol; // 记录n个皇后所占用的列号
boolean[] col; // 列安全标志
boolean[] diagonal; // 对角线安全标志
boolean[] undiagonal; // 反对角线安全标志
public TestQueen(int n) {
this.n = n;
queenCol = new int[n];
col = new boolean[n];
diagonal = new boolean[2 * n - 1];
undiagonal = new boolean[2 * n - 1];
for (int i = 0; i < n; i++)
// 置所有列为安全
col[i] = true;
for (int t = 0; t < (2 * n - 1); t++)
// 置所有对角线为安全
diagonal[t] = undiagonal[t] = true;
}
public void run() {
solve(0);
if (num == 0) {
System.out.println(n + "皇后无解!");
}
}
// 从i行开始,把之后的皇后放好
private void solve(int i) {
for (int j = 0; j < n; j++) {
if (col[j] && diagonal[i - j + n - 1] && undiagonal[i + j]) {
// 表示第i行第j列是安全的可以放皇后(i,j从0开始)
queenCol[i] = j;
col[j] = false; // 修改安全标志
diagonal[i - j + n - 1] = false;
undiagonal[i + j] = false;
if (i < n - 1) // 判断是否放完n个皇后
{
solve(i + 1); // 未放完n个皇后则继续放后面的
} else // 已经放完n个皇后
{
num++;
System.out.println("皇后摆放第" + num + "种方案:");
System.out.print("行分别为");
for (int k = 0; k < n; k++)
System.out.print(k + " ");
System.out.print("\n");
System.out.print("列分别为");
for (int k = 0; k < n; k++)
System.out.print(queenCol[k] + " ");
System.out.print("\n");
}
col[j] = true; // 修改安全标志,回溯
diagonal[i - j + n - 1] = true;
undiagonal[i + j] = true;
}
}
}
public static void main(String[] args) {
TestQueen q = new TestQueen(5);
q.run();
}
}
输出结果:
皇后摆放第1种方案:
行分别为0 1 2 3 4
列分别为0 2 4 1 3
皇后摆放第2种方案:
行分别为0 1 2 3 4
列分别为0 3 1 4 2
皇后摆放第3种方案:
行分别为0 1 2 3 4
列分别为1 3 0 2 4
皇后摆放第4种方案:
行分别为0 1 2 3 4
列分别为1 4 2 0 3
皇后摆放第5种方案:
行分别为0 1 2 3 4
列分别为2 0 3 1 4
皇后摆放第6种方案:
行分别为0 1 2 3 4
列分别为2 4 1 3 0
皇后摆放第7种方案:
行分别为0 1 2 3 4
列分别为3 0 2 4 1
皇后摆放第8种方案:
行分别为0 1 2 3 4
列分别为3 1 4 2 0
皇后摆放第9种方案:
行分别为0 1 2 3 4
列分别为4 1 3 0 2
皇后摆放第10种方案:
行分别为0 1 2 3 4
列分别为4 2 0 3 1
分享到:
2011-10-19 20:51
浏览 1957
评论
n皇后问题java_经典n皇后问题java代码实现相关推荐
- 八皇后java_经典八皇后问题:Java语言
问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行.同一列或者同一对角线上)如图所示,题目来自于<java语言程序设计:基础篇>练习题6.20和6.22 ...
- 守望者逃离 java_守望者的逃离 (Java代码)
解题思路: 注意事项: 参考代码: import java.util.Scanner; public class Main{ public static void main(String[]ages) ...
- 表示我想你的代码java_如何编写可怕的Java代码?
我决定告诉你如何编写可怕的Java代码.如果你厌倦了所有这些美丽的设计模式和最佳实践,并且想写些疯狂的东西,请继续阅读. 如果你正在寻找有关如何编写良好代码的建议,请查看其它文章! 对一切使用异常 你 ...
- 罪恶都市洛杉矶java_「洛杉矶时间」Java代码获取美国洛杉矶的时间 - seo实验室...
洛杉矶时间 TimeZone time1 = TimeZone.getTimeZone("America/Los_Angeles"); Date today1 = calendar ...
- stopwatch java_利用StopWatch类监控Java代码执行时间并分析性能
springframework中的StopWatch类可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用Sto ...
- 选址问题java_邮局选址问题 (Java代码)
解题思路: 注意事项: 参考代码:import java.util.Scanner; public class A1262 { public static void main(String args[ ...
- pmd java_用PMD自动执行Java代码静态分析
一起学习 一.基础知识 PMD是一种分析Java代码错误的工具.与其他分析工具不同的是,PMD通过静态分析获知代码错误.也就是说,在不运行Java程序的情况下报告错误.PMD附带了许多可以直接使用的规 ...
- Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案
7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行.同列.同一对角线).编写程序显示一个解决方案 题目 题目描述 破题 题目 题目描述 ...
- 三种算法求解经典N皇后问题
三种算法求解经典N皇后问题 [问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, ...
最新文章
- codevs 4560 NOIP2015 D2T2 子串
- php中 可替代curl,laravel-PHP-为什么使用Guzzle代替cURL?
- 牛客小白月赛37【部分题解】
- 使用redis的zset实现排行榜
- python debug
- mysql sqlsugar_.net core +mysqlSugar(最为简单的增删改查)
- Vue.js仿QQ音乐(移动端)
- 亚信安全认证acse_安全世界 5正当时 | 邀您共启”2020第五空间战略发展高峰论坛”...
- 关于weight decay
- vue项目中金额小写转换为汉字大写的功能封装
- 【STM32学习笔记】(7)——STM32时钟系统详解
- fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统
- Java开发erp系统,高级面试题+解析
- 再次登顶GitHub,阿里内网首次自曝炫彩版微服务响应式与K8S手册
- 移动端切图内容包括什么_移动终端界面切图
- Android利用谷歌地图获取并解析经纬度对应的地理位置
- Unity网格系统(1)网格生成
- 云计算,社交网络,移动互联网
- 华南理工大学(计算机技术)往年(?- 2019)专业面试题总结
- 无线路由器设置成无线AP,解决家里设备不在一个网段的尴尬
热门文章
- Android Studio设置
- 2013科目三道路驾驶技能通用评判标准
- 广州驾校考试实际道路考试注意事项(图)
- 切记!这样洗头最伤身
- 浅谈:国内软件公司为何无法做大做强?
- 编程语言API性能大比拼
- 【ffmpeg for wince】音视频编解码多平台移植(for window/wince)
- awk 中 {print $1} 什么意思
- Duplicate entry ‘XXX‘ for key
- USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)