我的算法是设x[8],y[8]两个数组,分别代表某次的8个皇后的横坐标和纵坐标,然后在cmp(int x[],int y[])函数中对其进行判断,符合皇后共存的条件则返回true。
for(i=0;i<8;i++){
    x[i]=rand.nextInt(8);
    y[i]=rand.nextInt(8);
}
x和y坐标通过随机数获得,对应8个皇后,main()中用大量循环每次给cmp()传不同的随机x,y数组,得到true的话打出信息.
但是这样的效率很低,能不能把512种(不知是不是)x,y的组合求出来然后让算法只执行有限次。即是求出8*8棋盘上8个棋子的排列方法的集合.求!!!
下面附上全部代码:
import java.util.Random;
public class P725b { public static boolean cmp(int x[],int y[]){
int i,j,m;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(i!=j){
if(x[i]==x[j]&&x[i]==x[j])
return false;
}
}
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(i!=j){

if(x[i]==x[j]||y[i]==y[j])
return false;
for(m=0;m<8;m++){
if(x[i]+m==x[j]&&y[i]+m==y[j])
return false;
if(x[i]-m==x[j]&&y[i]+m==y[j])
return false;
if(x[i]+m==x[j]&&y[i]-m==y[j])
return false;
if(x[i]-m==x[j]&&y[i]-m==y[j])
return false;
}
}
}
}
return true;
}
public static void main(String[] args) {
int [][]queen=new int[8][8];
Random rand=new Random();
int []x=new int[8];
int []y=new int[8];
int i,j,cnt=0;
while(true){
for(i=0;i<8;i++){
for(j=0;j<8;j++)
queen[i][j]=0;
}
for(i=0;i<8;i++){
x[i]=rand.nextInt(8);//这个地方效率低下
y[i]=rand.nextInt(8);//求棋盘遍历后的x,y的集合
}
if(P725b.cmp(x, y)==true){
for(i=0;i<8;i++){
queen[x[i]][y[i]]=1;
}
for(i=0;i<8;i++){
for(j=0;j<8;j++)
System.out.printf("%2d",queen[i][j]);
System.out.println();
}
System.out.println();
}
cnt++;
}

}
}

解决方案 »

  1.   

    网上有好多例子的..
    BAIDU GOOGLE随便一下就能找到你这例子确实效率很低..居然还用随机数..最简单的,穷举稍微考虑一下,就知道每一行只能有一个皇后,那么只需要穷举8个皇后的纵坐标就行了,横坐标肯定是一行一个(反过来也一样)再稍微难一点的,每放一个皇后,就把其他不能再放皇后的格子算出来,这样..