八皇后问题的暴力解决

来源:互联网 发布:淘宝等级规则 编辑:程序博客网 时间:2024/05/03 20:18

本解决办法不使用深奥的算法思想,有点暴力,仅供各位参考。

编程的思想是不断让计算机自己尝试解决八皇后的问题,直到得到了一个解决方案,所以每次运行程序时都可以得到一个八皇后的解决方案,但是每次得到的结果很可能不尽相同。

8*8的棋盘,首先从第一行开始下起,由计算机随机选择一个位置,位置选定后,将棋盘上与第一个皇后相冲突的位置全部标记为不可用。

然后是第二行,也是由计算机随机选择一个位置,当然如果选择到了已经不可用的位置就让计算机重新选择,直到选择到了一个符合规则的位置,选择好了后再将与第二个皇后相冲突的位置全部标记为不可用。

如是,进行第三行到第八行皇后的位置的选定。

显然,大多数情况下,在某一行会出现没有任何一个位置可以选择的情况,这说明此次布局失败了,这里我们就不回溯了,就让计算机从第一行重新下。

直到第八行也能放下皇后了,就将整个八皇后的布置情况输出。

经过测试,可以得到结果。这个算法是让计算机不停地随机地尝试,得到的结果也是随机的。


以下是该算法的java程序。

public class H6_20{public static void main(String[] args) {int matrix[][]= new int[8][8];int ran = -1;while(true){//初始化mateixfor(int i=0; i<8; ++i){for(int j=0; j<8; ++j){matrix[i][j] = 0;}}//first rowran = (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 rowran = (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 rowif( (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 rowif( (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 rowif( (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 rowif( (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 rowif( (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 rowif( (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 queensSystem.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 functionpublic 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");}}}


0 0