八皇后问题
经典的八皇后问题是要将八个皇后放在8*8的棋盘上,任何两个皇后都不能互相攻击(即没有两个皇后是在同一行、同一列或者同一对角线上)。可能的解决的方案有92种,可以使用回溯算法来实现。编写程序显示所有的解决方案,输出实例如下:
...
public class EightQueens {
private static int column = 0;
public static void main(String[] args){
int count = 0;//统计有多少种解决方案
//皇后的位置
int[] queens = new int [8];// 皇后位置在 (i, queens[i])
for(int i = 0; i < 8; i++)
queens[i] = -1;//- 1表示没有女王现在排在第一列
queens[0] = 0;//第一个皇后为(0,0)
//K - 1表示到目前为止放置的皇后数。
//我们正在寻找第k行的位置放置一个皇后
int k = 1;
while ( k >= 0 ) {
//找到一个位置放置一个皇后在第k行
int j = findPosition(k, queens);
if ( j < 0 ) {
queens[k] = -1;
k--; //回溯到上一行
}
else {
queens[k] = j;
if (k == 7) {
count ++;//找到另一个解决方案
System.out.println("Solution " + count + ":" );
printResult(queens);
}
else {
k++;
}
}
}
System.out.println("How many soultion? " + count );
}
/**
* 寻找皇后位置
*/
public static int findPosition(int k, int[] queens) {
int start = queens[k] == -1 ? 0 : queens[k] + 1;
for (int j = start; j < 8; j++){
if (isValid(k, j, queens))
return j; //(k , j)是现在皇后的位置
}
return -1;
}
/**
* 返回true如果皇后可以放置在(k,j)
*/
public static boolean isValid(int k, int j, int queens[]) {
//查看是否(k,j)是可能的位置
//检查第j列
for (int i = 0; i < k; i++)
if (queens[i] == j)
return false;
//检查所有的行
for (int row = k - 1, column = j - 1; row >= 0 && column >= 0; row--,column--)
if (queens[row] == column)
return false;
for (int row = k - 1, column = j + 1; row >= 0 && column <= 7; row--,column++)
if (queens[row] == column)
return false;
return true;
}
/**
* 打印出皇后
*/
public static void printResult(int[] queens) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < queens[i]; j++)
System.out.print("| ");
System.out.print("|Q|");
for (int j = queens[i] + 1; j < 8; j++)
System.out.print(" |");
System.out.println();
}
}
}