问题描述:在 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循环的下一个元素。

最新文章

  1. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
  2. Leetcode | Minimum/Maximum Depth of Binary Tree
  3. (04)odoo视图操作
  4. shell之here文档
  5. MySql5.6 Window超详细安装教程
  6. .NET开发Windows Service程序 - Topshelf
  7. iOS顶部滑动菜单:FDSlideBar 与NinaPagerView
  8. 由Qt4.x项目移植到Qt5.x需要注意的事项
  9. Java程序i学习中各阶段的建议
  10. 比较容易理解的---原生js瀑布流
  11. Educational Codeforces Round 20.C
  12. 刚在在win8.1下装了ubuntu12.04
  13. DAY25、面向对象总复习
  14. SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
  15. react-native 插件汇总
  16. Weex 实现文件的下载
  17. java数据结构 栈stack
  18. 分表需要解决的问题 &amp; 基于MyBatis 的轻量分表落地方案
  19. liunx trac 插件使用之GanttCalendarPlugin
  20. struts框架问题四之获取到值栈的对象

热门文章

  1. 高效、优雅的对象copy之MapStruct入门到精通,实战踩坑版
  2. Docker挂载
  3. 阅读openfoam框图
  4. CF1358D The Best Vacation
  5. pytorch学习笔记五之通过示例学习
  6. windows pwn(一)
  7. 【译】.NET 7 中的性能改进(十)
  8. 记一次hooks陷阱
  9. mybatis日志打印到控制台
  10. PTA---求月天数