16.java八皇后问题
2024-09-08 19:18:12
问题描述:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 、同一列或同一斜线上,问有多少种摆法(92)。
思路分析:1) 第一个皇后先放第一行第一列2) 第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适3) 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确解4) 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4 的步骤
代码如下:
package linkedlist; import java.util.Queue; public class queen {
int max=8;
int [] array=new int[max];
static int count;
public static void main(String args[]){
queen queue=new queen();
queue.check(0);
System.out.println(count);
}
public boolean judge(int n){
for (int i=0;i<n;i++){
if(array[i]==array[n]||Math.abs(i-n)==Math.abs(array[i]-array[n])){
return false;
}
}
return true;
}
public void check(int n){
if(n==max){
print();
return;
}
for (int i=0;i<max;i++){
array[n]=i;
if(judge(n)){
check(n+1);
} }
}
private void print() {
count++;
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
其实这个回溯以for循环的角度来看会好理解很多,这个问题可以看成八个for循环嵌套。当最里面的for循环执行完毕后会接着执行紧贴着其的那层外层for循环的下一个元素。
最新文章
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
- Leetcode | Minimum/Maximum Depth of Binary Tree
- (04)odoo视图操作
- shell之here文档
- MySql5.6 Window超详细安装教程
- .NET开发Windows Service程序 - Topshelf
- iOS顶部滑动菜单:FDSlideBar 与NinaPagerView
- 由Qt4.x项目移植到Qt5.x需要注意的事项
- Java程序i学习中各阶段的建议
- 比较容易理解的---原生js瀑布流
- Educational Codeforces Round 20.C
- 刚在在win8.1下装了ubuntu12.04
- DAY25、面向对象总复习
- SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
- react-native 插件汇总
- Weex 实现文件的下载
- java数据结构 栈stack
- 分表需要解决的问题 &; 基于MyBatis 的轻量分表落地方案
- liunx trac 插件使用之GanttCalendarPlugin
- struts框架问题四之获取到值栈的对象