`
flashdream8
  • 浏览: 678715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

八皇后问题

J# 
阅读更多
     这就是著名的八皇后问题。八个皇后在排列时不能同在一行、一列或一条斜 
线上。在8!=40320种排列中共有92种解决方案。 
class EightQueen
{ 
    static final int MAXSIZE = 8;//棋盘大小
    static int okTimes = 0; //解法个数
    static int[][] chess = new int[MAXSIZE][MAXSIZE];//棋盘

    public static boolean CanPut(int row,int col)
    {//皇后能否放置在chess[row][col]的位置上
        //第row行不能有多于1个皇后
        int i,j;
        for(i=0;i<MAXSIZE;++i)
        {
            if(chess[row][i]==1)
                return false;
        }
        //第col列不能有多于1个皇后
        for(i=0;i<MAXSIZE;++i)
        {
            if(chess[i][col]==1)
                return false;
        }
        //对角线不能有多于1个皇后
        //反对角线
        for(i=row-1,j=col+1;i>=0&&j<MAXSIZE;--i,++j)
        { 
            if(chess[i][j]==1)
                return false;
        }
        for(i=row+1,j=col-1;i<MAXSIZE&&j>=0;++i,--j)
        {
            if(chess[i][j]==1)
                return false;
        }    
        //对角线
        for(i=row-1,j=col-1;i>=0&&j>=0;--i,--j)
        {
            if(chess[i][j]==1)
                return false;
        }
        for(i=row+1,j=col+1;i<MAXSIZE&&j<MAXSIZE;++i,++j)
        {
            if(chess[i][j]==1)
                return false;
        }
        return true;
    }
    public static void Solve(int curChess,int num)
    {
        if(num==8)
        {//八个皇后了,
            okTimes++;
            return;
        }
        else
        {
            if(curChess<64)
            {
                int i,j;
                i=curChess/MAXSIZE;//行
                j=curChess%MAXSIZE;//列
                if(chess[i][j]==0&&CanPut(i,j)==true)
                {//chesss[i][j]空着,并且经测试可以放置
                    chess[i][j]=1; //放置皇后下去
                    Solve(curChess+1,num+1);
                    chess[i][j]=0; //回溯
                }
                Solve(curChess+1,num); //chess[i][j]无法放置,跳过它
            }
        }
    }
    public static void main(String args[])
    { 
        int i,j;
        for(i=0;i<MAXSIZE;++i)
            for(j=0;j<MAXSIZE;++j)
            {
                chess[i][j] = 0;
            }
        Solve(0,0);
        System.out.println("八皇后问题共有"+okTimes+"个解法"); 
    }
} 

 

class Queen8{

  static final int QueenMax = 8;
  static int oktimes = 0;
  static int chess[] = new int[QueenMax];//每一个Queen的放置位置


  public static void main(String args[]){
    for (int i=0;i<QueenMax;i++)chess[i]=-1; 
    placequeen(0);
    System.out.println("\n\n\n八皇后共有"+oktimes+"个解法 made by yifi 2003");
  }


  public static void placequeen(int num){ //num 为现在要放置的行数
    int i=0;
    boolean qsave[] = new boolean[QueenMax];
    for(;i<QueenMax;i++) qsave[i]=true;
    
    //下面先把安全位数组完成
    i=0;//i 是现在要检查的数组值
    while (i<num){
      qsave[chess[i]]=false;
      int k=num-i;
      if ( (chess[i]+k >= 0) && (chess[i]+k < QueenMax) ) qsave[chess[i]+k]=false;
      if ( (chess[i]-k >= 0) && (chess[i]-k < QueenMax) ) qsave[chess[i]-k]=false;
      i++;
    }
    //下面历遍安全位
    for(i=0;i<QueenMax;i++){
      if (qsave[i]==false)continue;
      if (num<QueenMax-1){
        chess[num]=i;
        placequeen(num+1);
      }
      else{ //num is last one
      chess[num]=i;
      oktimes++;
      System.out.println("这是第"+oktimes+"个解法 如下:");
      System.out.println("第n行:  1 2 3 4 5 6 7 8");
      
      for (i=0;i<QueenMax;i++){
       String row="第"+(i+1)+"行:  ";
       if (chess[i]==0);
       else 
        for(int j=0;j<chess[i];j++) row+="--";
        row+="++";
        int j = chess[i];
        while(j<QueenMax-1){row+="--";j++;}
       System.out.println(row);
      }
      }
    }
  //历遍完成就停止
  }
}

 

分享到:
评论

相关推荐

    mfc实现八皇后问题

    八皇后问题是一个经典的计算机编程问题,它涉及到回溯算法、数据结构和图形用户界面的设计。在C++中,特别是结合MFC(Microsoft Foundation Classes)框架,可以创建具有用户友好界面的程序来解决此问题。 首先,...

    八皇后问题详细的解法-23页 PPT PDF版.pdf

    ### 八皇后问题详解 #### 一、八皇后问题背景 八皇后问题是一个经典的计算机科学问题,也是数学领域中一个有趣的挑战。这个问题来源于国际象棋的背景:如何在一个8×8的国际象棋棋盘上放置八个皇后,使得没有任何...

    爬山法、模拟退火法、遗传算法实现八皇后问题

    它们被应用于解决各种复杂问题,包括经典的八皇后问题。八皇后问题是一个著名的棋盘放置问题,要求在8×8的棋盘上摆放8个皇后,使得任意两个皇后都不能在同一行、同一列或同一对角线上。下面将详细解释这些方法以及...

    八皇后问题 c++ 八皇后问题 c++

    八皇后问题 c++ 八皇后问题 c++ 八皇后问题 c++

    八皇后问题回溯求解 matlab

    用回溯求解法求解八皇后问题,经典问题matlab实现,欢迎大家下载

    数据结构八皇后问题实验报告

    数据结构八皇后问题实验报告是一份详尽的项目文档,主要涵盖了八皇后问题的解决方案,该问题是一个经典的计算机科学和算法问题,源自国际象棋。报告的作者花费了两周时间完成,显然投入了大量的精力和思考。 八皇后...

    八皇后问题课程设计论文

    八皇后问题课程设计论文

    八皇后问题源码 python

    解决八皇后问题的源码,带有注释,由于数据结构即算法的学习,如有其他需要,请留言

    汇编解决八皇后问题

    作业代码,汇编写八皇后问题,自己写了一份,在网上找的也在里面

    C++八皇后问题代码,递归实现

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

Global site tag (gtag.js) - Google Analytics