本解决办法不使用深奥的算法思想,有点暴力,仅供各位参考。
编程的思想是不断让计算机自己尝试解决八皇后的问题,直到得到了一个解决方案,所以每次运行程序时都可以得到一个八皇后的解决方案,但是每次得到的结果很可能不尽相同。
8*8的棋盘,首先从第一行开始下起,由计算机随机选择一个位置,位置选定后,将棋盘上与第一个皇后相冲突的位置全部标记为不可用。
然后是第二行,也是由计算机随机选择一个位置,当然如果选择到了已经不可用的位置就让计算机重新选择,直到选择到了一个符合规则的位置,选择好了后再将与第二个皇后相冲突的位置全部标记为不可用。
如是,进行第三行到第八行皇后的位置的选定。
显然,大多数情况下,在某一行会出现没有任何一个位置可以选择的情况,这说明此次布局失败了,这里我们就不回溯了,就让计算机从第一行重新下。
直到第八行也能放下皇后了,就将整个八皇后的布置情况输出。
经过测试,可以得到结果。这个算法是让计算机不停地随机地尝试,得到的结果也是随机的。
以下是该算法的java程序。
public class H6_20{
public static void main(String[] args)
{
int matrix[][]= new int[8][8];
int ran = -1;
while(true)
{
//初始化mateix
for(int i=0; i<8; ++i)
{
for(int j=0; j<8; ++j)
{
matrix[i][j] = 0;
}
}
//first row
ran = (int)(Math.random()*8);
matrix[0][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[0][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=0)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<8; ++i)
{
if( ran+i > 7)
{
break;
}
matrix[0+i][ran+i] = -1;
}
for(int i=1; i<8; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[0+i][ran-i] = -1;
}
dispaly(matrix);
//second row
ran = (int)(Math.random()*8);
while(matrix[1][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[1][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[1][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=1)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<7; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[1+i][ran+i] = -1;
}
for(int i=1; i<7; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[1+i][ran-i] = -1;
}
dispaly(matrix);
//third row
if( (matrix[2][0]+matrix[2][1]+matrix[2][2]+matrix[2][4]+matrix[2][5]+matrix[2][6]+matrix[2][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[2][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[2][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[2][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=2)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<6; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[2+i][ran+i] = -1;
}
for(int i=1; i<6; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[2+i][ran-i] = -1;
}
dispaly(matrix);
//fourth row
if( (matrix[3][0]+matrix[3][1]+matrix[3][2]+matrix[3][4]+matrix[3][5]+matrix[3][6]+matrix[3][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[3][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[3][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[3][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=3)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<5; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[3+i][ran+i] = -1;
}
for(int i=1; i<5; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[3+i][ran-i] = -1;
}
dispaly(matrix);
//fifth row
if( (matrix[4][0]+matrix[4][1]+matrix[4][2]+matrix[4][4]+matrix[4][5]+matrix[4][6]+matrix[4][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[4][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[4][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[4][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=4)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<4; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[4+i][ran+i] = -1;
}
for(int i=1; i<4; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[4+i][ran-i] = -1;
}
dispaly(matrix);
//sixth row
if( (matrix[5][0]+matrix[5][1]+matrix[5][2]+matrix[5][4]+matrix[5][5]+matrix[5][6]+matrix[5][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[5][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[5][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[5][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=5)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<3; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[5+i][ran+i] = -1;
}
for(int i=1; i<3; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[5+i][ran-i] = -1;
}
dispaly(matrix);
//seventh row
if( (matrix[6][0]+matrix[6][1]+matrix[6][2]+matrix[6][4]+matrix[6][5]+matrix[6][6]+matrix[6][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[6][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[6][ran] = 1;
for(int i=0; i<8; ++i)
{
if(i!=ran)
{
matrix[6][i] = -1;
}
}
for(int i=0; i<8; ++i)
{
if(i!=6)
{
matrix[i][ran] = -1;
}
}
for(int i=1; i<2; ++i)
{
if( ran+i > 7 )
{
break;
}
matrix[6+i][ran+i] = -1;
}
for(int i=1; i<2; ++i)
{
if( ran-i < 0 )
{
break;
}
matrix[6+i][ran-i] = -1;
}
dispaly(matrix);
//eightth row
if( (matrix[7][0]+matrix[7][1]+matrix[7][2]+matrix[7][4]+matrix[7][5]+matrix[7][6]+matrix[7][7])==-7 ) continue;
ran = (int)(Math.random()*8);
while(matrix[7][ran]!=0)
{
ran = (int)(Math.random()*8);
}
matrix[7][ran] = 1;
dispaly(matrix);
break;
}
//display queens
System.out.print("\n");
for(int i=0; i<8; ++i)
{
for(int j=0; j<8; ++j)
{
System.out.print("| ");
if(matrix[i][j]==1)
{
System.out.print("Q");
}
else
{
System.out.print(" ");
}
}
System.out.print("|"+"\n");
}
}
//display function
public static void dispaly(int[][] array)
{
System.out.print("\n");
for(int i=0; i<8; ++i)
{
for(int j=0; j<8; ++j)
{
System.out.print("| ");
System.out.printf("%2s" ,array[i][j]);
}
System.out.print("|"+"\n");
}
}
}