在一个n*n的棋盘上放置皇后,要求:一个皇后的同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。
思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一个皇后,那么第i行中皇后究竟应该放哪儿呢?我们可以从第i行第一列开始依次向后逐格判断,看看若放在当前位置是否会冲突,若不冲突,则继续考虑下一行,若冲突,则继续向后移动一格,再判断。 若i行所有的位置都不满足,则回溯,将i-1行皇后的位置往后移动,直到找到一个合理的位置,再继续从前往后寻找i行的位置。
求解4皇后问题。
result数组:存储结果集。
/**
* N皇后问题
* @param n 矩阵规模
* @param i 行号
* @param result 皇后的结果集(下标表示行号,值表示列号)
*/
void NQueen( int n, int i, int[] result ){
for( int j=0; j<n; j++ ){
if ( canPlace(n,i,j,result) ){
result[i] = j;
if ( i==n-1 ) {
printResult(result);
}
else {
NQueen(n,i+1,result);
}
}
}
}
/**
* 判断第i行第j列能不能放
* @param n 矩阵规模
* @param i 行号
* @param j 列号
* @param result 皇后的结果集(下标表示行号,值表示列号)
*/
private boolean canPlace(int n, int i, int j, int[] result){
for( int z=0; z<i; z++ ){
// 判断列号是否相同、是否在对角线上(长、宽是否相等)
if ( j==result[z] || (i-z)==Math.abs(j-result[z]) )
return false;
}
return true;
}
/**
* 打印结果集
* @param result 结果集
*/
private void printResult(int[] result){
for( int i=0; i<result.length; i++ ){
System.out.println("第"+i+"行,第"+result[i]+"列");
}
}