八皇后问题

     这就是著名的八皇后问题。八个皇后在排列时不能同在一行、一列或一条斜 
线上。在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);
      }
      }
    }
  //历遍完成就停止
  }
}

 

你可能感兴趣的:(J#)