题目:八皇后问题
有一个 8x8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线,都不能有另一个棋子。找到所有满足这种要求的放棋子方式
回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律 地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程分为多个阶段。每个阶段, 我们都会面对一个岔路口,我们先随意选一条路走,当发现这条路走不通的时候(不符合期 望的解),就回退到上一个岔路口,另选一种走法继续走。
Java代码如下:
public class Test1 {
/**
*八皇后问题:
* 有一个 8x8 的棋盘,希望往里放 8 个棋子(皇后),每个棋子所在的行、列、对角线
* 都不能有另一个棋子。找到所有满足这种要求的放棋子方式
*/
@Test
public void test1(){
cal8Queens(0);
}
int[] result = new int[8]; //存储每个列的标号
//递归实现算法
public void cal8Queens(int row){
if(row == 8){
printArray(result);
return;
}
for(int column=0;column<8;column++){
if(isOk(row,column)){
result[row] = column;
cal8Queens(row+1);
}
}
}
//满足 8 皇后的规则要求
public boolean isOk(int row,int column){
int leftCl = column-1;
int rightCl = column+1;
for(int i=row-1;i>=0;i--){
if(result[i] == column)
return false;
if(leftCl>=0&&result[i] == leftCl){ //判断左上对角线是否满足无棋子的要求
return false;
}
if(rightCl<8&&result[i] == rightCl){ //判断右上对角线是否满足无棋子的要求
return false;
}
leftCl--;
rightCl++;
}
return true;
}
public void printArray(int[] array){
int row = 0;
for(int a:array){
System.out.println((row++)+","+a);
}
System.out.println("-------------------------------------");
}
}
输出为每种可能 (只列出第一种排列方式,第一列为行号,第二列为列号)
0,0
1,4
2,7
3,5
4,2
5,6
6,1
7,3