算法题(八皇后)

问题:

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

代码:

public class huanghou{
  private int[] column;//同栏是否有皇后,1表示有
  private int[] rup;//右上至左下是否有皇后
  private int[] lup;//左上至右下是否有皇后
  private int[] queen;//解答
  private int num;//解答编号
  public huanghou(){
    column=new int[8+1];
    rup=new int[(2*8)+1];
    lup=new int[(2*8)+1];
    for(int i=1;i<=8;i++)
      column[i]=0;
      for(int i=1;i<=(2*8);i++)
      rup[i]=lup[i]=0; //初始定义全部无皇后

      queen=new int[8+1];
  }

  public void backtrack(int i){
    if(i>8){
      showAnswer();
    }else{
      for(int j=1;j<=8;j++){
        if((column[j]==0)&&(rup[i+j]==0)&&(lup[i-j+8]==0)){
          queen[i]=j;
          column[j]=rup[i+j]=lup[i-j+8]=1;
          backtrack(i+1);
          column[j]=rup[i+j]=lup[i-j+8]=0;
        }
      }
    }
  }

  protected void showAnswer(){
    num++;
    System.out.println("\n解答"+num);

    for(int y=1;y<=8;y++){
      for(int x=1;x<=8;x++){
        if(queen[y]==x){
          System.out.print("Q");
        }else{
          System.out.print(".");
        }
      }
      System.out.println();
    }
  }

  public static void main(String[]args){
    huanghou h=new huanghou();
    h.backtrack(1);
  }
}

时间: 2024-07-29 18:57:11

算法题(八皇后)的相关文章

递归之回朔算法应用----八皇后问题

从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生.哈哈 开个玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种方法可以解决此问题.

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

算法系列——八皇后问题

public class Queen { private final int size; private int[] location; private int[] columnOccupied; private int[] lineOccupied; //对角线 private int[] reverseLineOccupied; //反对角线 private static int solveCount; private static final int locationOccupied =

回溯算法(八皇后问题)

八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子. 将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 程序实现 程序摘自回溯法与八皇后问题 #include<iostream> #include<math.h> using namespace std; int n=8; int total=0; int *c=new int(n); //下标为行数,存的数为列数 bool is_ok(int row

JAVA常见算法题(八)

package com.xiaowu.demo; /** * 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加), * 几个数相加由键盘控制. * * @author WQ * */ public class Demo8 { public static void main(String[] args) { sum(2, 5); } public static void sum(int a, int n) { in

八皇后(JAVA算法实现)

在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

递归的应用——八皇后问题

回朔算法的基本思想 ·从问题的某一种状态出发,搜索可以到达的状态 ·当某个状态到达后,可向前回退,并继续搜索其他可达状态 ·当所有状态都到达后,回朔算法结束 程序设计中可以利用函数的活动对象保存回朔算法的状态数据,因此可以利用递归完成回朔算法. 八皇后算法 1 初始化 I = 1 2 初始化 J = 1 3 从第i行开始,恢复j的当前值,判断第j个位置 A`位置j可放入皇后:标记位置(i,j),i++,转步骤2 B`位置j不可以放入皇后:j++,转至步骤A C`当j>8时,i--,转至步骤3 4

c++ 八皇后问题(转载)

转自 雪狼的程序故事 http://www.cnblogs.com/gaoteng/archive/2012/04/11/2442692.html 经典回溯算法(八皇后问题) 今天偶尔看到了一个算法问题(八皇后问题),回想一下还是在算法课上学习过的,于是,自己总结了一下,写了这篇日志 算法提出: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上.问共有多少种不同的方法,并且指出各种不同的放法. 算法思路: 首先我们分析一下问题的解,我们每取