zoukankan      html  css  js  c++  java
  • [递归算法]八皇后(不确定正确性)

    思路其实很简单,就是回朔,先看看这一行这个位置会不会和上面的后宫冲突,不行就退回上一层,可以就尝试下一层,下一层完成后就往右移一个

    这个递归算法并不是最高效的,只是看上去很简单,有些变量基本上用不到,比如yPos,还有设为-1

    统计八皇后布局数量(92个版本,也就是不考虑重复问题)

    核心算法如下:

    //八皇后的核心算法,不考虑括号的话一共13行,中间还有4行是赋值,赋值为-1还没什么用
    public void findQueen(int[] xPos,int[] yPos,int level){

      if(level>=8){
        this.result++;
        return;
      }

      int xi=0;
      int yi=level;

      for(;xi<xPos.length;xi++){
        xPos[level]=xi;
        yPos[level]=yi;

        if(isValid(xPos,yPos,level))
          findQueen(xPos,yPos,level+1);

        xPos[level]=-1;
        yPos[level]=-1;
      }
    }

    //判断某一行的一个是否和上面的皇后冲突到
    public boolean isValid(int[] xPos,int[] yPos,int level){
      for(int i=0;i<level;i++){

        if(xPos[i]==xPos[level])
          return false;

        if((xPos[i]-yPos[i]==xPos[level]-yPos[level])||((7-xPos[i])-yPos[i]==(7-xPos[level]-yPos[level])))
          return false;
      }

    return true;
    }

    完整版如下:

    public class EightQueen {
    int[] xPos=new int[8];
    int[] yPos=new int[8];

    int result=0;

    public EightQueen(){
    for(int i=0;i<xPos.length;i++){
    xPos[i]=-1;
    yPos[i]=-1;
    }

    this.findQueen(xPos, yPos, 0);
    //System.out.println("result="+result);
    }


    public void findQueen(int[] xPos,int[] yPos,int level){
    //System.out.println(level);

    if(level>=8){
    this.result++;

    String[][] flags=new String[8][8];


    for(int i=0;i<8;i++)
    for(int j=0;j<8;j++)
    flags[i][j]="O ";

    for(int i=0;i<xPos.length;i++)
    flags[xPos[i]][yPos[i]]="X ";


    for(int i=0;i<8;i++){
    for(int j=0;j<8;j++){
    System.out.print(flags[i][j]);
    }
    System.out.println();
    }

    System.out.println();

    return;
    }



    int xi=0;
    int yi=level;

    for(;xi<xPos.length;xi++){
    xPos[level]=xi;
    yPos[level]=yi;

    if(isValid(xPos,yPos,level)){
    findQueen(xPos,yPos,level+1);
    }


    xPos[level]=-1;
    yPos[level]=-1;
    }
    }

    public boolean isValid(int[] xPos,int[] yPos,int level){
    for(int i=0;i<level;i++){

    if(xPos[i]==xPos[level])
    return false;

    if((xPos[i]-yPos[i]==xPos[level]-yPos[level])||((7-xPos[i])-yPos[i]==(7-xPos[level]-yPos[level]))){
    return false;
    }
    }

    return true;
    }


    public static void main(String[] args){
    EightQueen a=new EightQueen();

    }


    }

  • 相关阅读:
    Mercury产品介绍
    操纵txt文本文件
    MOSS开发辅助小工具
    Notes 8/8.5 超慢解决之道的最佳实践
    实战OO设计——OO设计原则
    SQL Server XML 拆分示例
    认识IL
    javascript 面向对象特性与编程实现
    MTV
    C#轻松仿造Vista风格窗体_cici 自娱自乐
  • 原文地址:https://www.cnblogs.com/imakoo/p/3199224.html
Copyright © 2011-2022 走看看