马上就要蓝桥杯比赛了,我这些算法还是不会,确实有点慌,今天一天早上睡到很晚不愿起床,然后才开始研究8皇后问题。这也是典型的回溯与递归问题。其实本质上和马踏棋盘问题非常类似,八皇后问题呢,就是要判断主对角线,副对角线,横排和竖排不能有皇后。这个是这个问题的着重点。先来看下八皇后问题吧。

1.问题描述:

    在8*8的棋盘中放8个皇后,使得每个皇后不能放在同一行,同一列,同一主对角线上(左下斜),同一副对角线上(右上斜)。

2.输入: 无(当然也可以优化求任意皇后,这个就不是重点了)

3.输出示例:

      1  *  *  *  *  *  *  *
      *  *  *  *  2  *  *  *
      *  *  *  *  *  *  *  3
      *  *  *  *  *  4  *  *
      *  *  5  *  *  *  *  *
      *  *  *  *  *  *  6  *
      *  7  *  *  *  *  *  *
      *  *  *  8  *  *  *  *

    ===============

    1  *  *  *  *  *  *  *
      *  *  *  *  *  2  *  *
      *  *  *  *  *  *  *  3
      *  *  4  *  *  *  *  *
      *  *  *  *  *  *  5  *
      *  *  *  6  *  *  *  *
      *  7  *  *  *  *  *  *
      *  *  *  *  8  *  *  *

    ===============

    ...........

    共有92种方法

4.算法思路:

    这题整体思想是用到递归与回溯,与马踏棋盘非常类似,但是比马踏棋盘问题要难,因为得判断对角线是否冲突,我这里判断是用一个vis[3][20]数组,为什么开始是3呢,因为本身是要判断4个方向不能有皇后的,但是递归是每一列,每一列的递归x,x+1.....这样必然不会在同一列上造成有皇后,则只需要另外3个方向,0表示同一行有皇后,1表示主对角线有皇后,2表示副对角线上有皇后。另外呢,怎么判断这些对角线上是否有皇后 呢?  如果我在第x列,第i行放了元素,那么vis[0][i] = 1表示我在第i行放了元素了。vis[1][x+i] = 1,表示如果我在第x列,第i行放了皇后,那么副对角线上,第x+1列,i-1行数就不能放皇后,第x-1列,第i+1行就不能放皇后,正好都是在副对角线上。vis[2][x-i+8] = 1,表示如果x==i了,那么恒等于vis[2][8] = 1就不能放了,即是主对角线。有了这三个条件既可以了。

5.代码如下:
import java.util.Scanner;

public class EightQueen {
    static int qipan[][] = new int[8][8];
    static int count = 0;
    static int step = 1;
    static int vis[][] = new int[3][20]; //三种情况主对角线,副对角线,行有没有被占用。
    public static void main(String[] args) {
        //初始化棋盘
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                qipan[i][j] = 0;
            }
        }
        for(int i=0;i<vis.length;i++){
            for(int j=0;j<vis[i].length;j++){
                vis[i][j] = 0;
            }
        }
        
        move(0);
        //从第0个位置开始放第一个皇后,没得说,只要求出皇后的位置,和摆放的数量即可。
        System.out.println("count = " + count);
    }
    public static void move(int x) {
        int next_x = x+1;
        if(step>8){
            for(int i=0;i<8;i++){
                for(int j=0;j<8;j++){
                    if(qipan[i][j] == 0){
                        System.out.printf("%3c",'*'); //把没有皇后,棋盘是0的位置用*输出,显得好看一点
                    }else{
                        System.out.printf("%3d",qipan[i][j]);
                    }
                    
                }
                System.out.println();
            }
            System.out.println("========================");
            count++;
        }else{
            for(int i=0;i<8;i++){
                if(vis[0][i]==0 && vis[1][x+i]==0 && vis[2][x-i+8]==0){//满足摆放条件
                    qipan[x][i] = step;
                    step++;
                    vis[0][i]=1; vis[1][x+i]=1; vis[2][x-i+8]=1;
                    move(next_x);
                    qipan[x][i] = 0;
                    vis[0][i]=0; vis[1][x+i]=0; vis[2][x-i+8]=0;
                    step--;
                    
                }
            }
        }
    }
}

易理解java代码8皇后问题的更多相关文章

  1. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题

    两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...

  2. 从Java代码到字节码(1)

    理解Java代码是如何被编译为字节码并在Java虚拟机(JVM)上执行是非常重要的,这将帮助理解你的程序是如何执行的.这样的理解不仅仅能够让你在逻辑上更好的掌握语言特性,而且能够有机会理解在做出重要决 ...

  3. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  4. 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

    一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...

  5. Java 虚拟机 最易理解的 全面解析

    先上一个最容易理解的类实例化的内存模型案例截图: 转载自:https://www.zybuluo.com/Yano/note/321063 周志明著的<深入理解 Java 虚拟机>的干货~ ...

  6. Java面向对象理解_代码块_继承_多态_抽象_接口

    面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...

  7. Java深度理解——Java字节代码的操纵

    导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话 ...

  8. java代码书写易犯错误

    java代码书写易犯错误: 常见报错: 控制台报错: 找不到或无法加载主类 HelloWorld 原因: java.lang.NoClassDefFoundError: cn/itcast/day01 ...

  9. 操作系统 | 结合 CPU 理解一行 Java 代码是怎么执行的

    根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...

随机推荐

  1. SqlServer varchar数据中类似于1.1.1.1这种值的排序方法

    select * from 表名order by Convert(int,left(列名,charindex('.',列名+'.')-1)) asc, 列名asc charindex('.',列名)  ...

  2. Microsoft Visual Studio 中出现 Windows has triggered a breakpoint in xxx.exe的一个解决方案

    今天在用VS发布Release版本的过程中,碰到了一个问题,就是程序编译没有问题,但是在运行过程中出现了 根据经验,此类问题一般都是由于程序开发过程中的代码编写不规范导致内存写覆盖或者是使用了不同版本 ...

  3. 如何解决JavaScript中0.1+0.2不等于0.3

    console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...

  4. Java开发API文档资源

    <netty> http://netty.io/4.1/api/index.html < Spring FrameWork > 1   http://spring.io/ 2 ...

  5. chrome下input文本框自动填充背景问题解决

    chrome下input文本框会自动填充背景,只需要给文本框加一个样式即可解决问题 input:-webkit-autofill {-webkit-box-shadow: 0 0 0px 1000px ...

  6. POJ 1021 2D-Nim

    Description The 2D-Nim board game is played on a grid, with pieces on the grid points. On each move, ...

  7. ajaxfileupload批量上传文件+图片尺寸限制

    1.首先展示ajaxfileupload代码,在这里修改为批量上传 //ajaxfileupload不展示全部代码,这是修改前与修改后代码对比,目的是上传多个文件 createUploadForm: ...

  8. 《清华梦的粉碎》by王垠

     清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进入清华大学读书,为我们家争光.我不知道清华是什么样子,但是我 ...

  9. java 集合类Array、List、Map区别和优缺点

    Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...

  10. Python基础学习参考(四):条件与循环

    在实际的开发中,想要实现某些功能或者需求,里面必然涉及到一些逻辑,复杂的也好简单也好,那么,通过python语法如何实现呢?这就涉及到了条件与循环.很显然绝大多数的语言都有条件和循环的语法,pytho ...