/*
* 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);
}
}
8皇后问题改进~
最新推荐文章于 2020-02-18 10:57:49 发布
以下内容为程序代码: