8皇后问题改进~

以下内容为程序代码:


/*
* 8皇后问题:
*在第一个的基础上,我对那个java实现稍做修改,添加
*一个计时器计时,时间好象缩短到原来的十分之一,不过不
*能实现n皇后功能,不过我觉得原来那样太慢,20个皇后也要
*跑半天,没多大意义,所以也就无所谓了。
*
*不足之处还请多多指教,谢谢!!!
*
*  
*/

public class Queen8 {
     int size=8;
     int resultCount=0;
   public void compute (  ) {
       int data[] = new int[8];
       for (int i1=0 ; i1<size/2 ; i1++ ) {
           data[0]=i1;
           for (int i2=0 ; i2<size ; i2++ ) {
               data[1]=i2;
               for (int i3=0 ; i3<size ; i3++ ) {
                   data[2]=i3;
                   for (int i4=0 ; i4<size ; i4++ ) {
                       data[3]=i4;
                       for (int i5=0 ; i5<size ; i5++ ) {
                           data[4]=i5;
                           for (int i6=0 ; i6<size ; i6++ )  {
                               data[5]=i6;
                               for (int i7=0 ; i7<size ; i7++ ) {
                                   data[6]=i7;
                                   for (int i8=0 ; i8<size ; i8++ ) {
                                       data[7]=i8;
                                       if ( test(data) ) {
                                           output( data );
                                       }
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
   }

   /*
    * 测试这种情况皇后的排列是否可行
    *
    */
   public boolean test( int[] data ) {
       int i,j;
       for ( i=0 ; i<size ; i++ ) {
           for ( j=i+1 ; j<size ; j++ ) {
               // 测试是否在同一排
               if ( data == data[j] )
                   return false;
               // 测试是否在一斜线
               if ( (data+i) == (data[j]+j) )
                   return false;
               // 测试是否在一反斜线
               if ( (data-i) == (data[j]-j) )
                   return false;
           }
       }
       return true;
   }

   /*
    * 输出某种情况下皇后的坐标
    *
    */
   public void output ( int[] data ) {
       int i;
       System.out.print ( ++resultCount + ": " );
       for ( i=0 ; i<size ; i++ ) {
           System.out.print ( "(" + i + "," + data + ") " );
       }
       System.out.println ();
       //由于正方形的对称性,我们可以只算一半,而把另一半通过对称规则找出来。
       System.out.print ( ++resultCount + ": " );
       for ( i=0 ; i<size ; i++ ) {
           System.out.print ( "(" + i + "," + (7-data)+ ") " );
       }
       System.out.println ();
   }
   public static void main(String args[]) {
       long starTime=0,endTime=0;
       double elapsedTime=0.0;
       starTime = System.currentTimeMillis();
       (new Queen8()).compute(  );
       endTime=System.currentTimeMillis();
       elapsedTime = (endTime-starTime)/1000.0;
       System.out.println(elapsedTime);
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值