1.问题概述:在一个4*4的方格中住着四个皇后,他们之间都不友好,相邻就会打架,现在要进行查找能够满足:每行每列每个斜线都只有一个皇后,才能没有打架发生
2.思路:
这里需要这样进行查找,第一个皇后先在第一行第一列开始假定位置,然后第二行第二个皇后满足条件来摆放,如果到后面有皇后不能放在能满足条件地方了时就回到她的前一个皇后并换一个地方,或者在前一个。。。就这样,最后得到了结果是2413
定义一个数组a[5],a[i]=j表示第i个皇后放在第i行第j列
这个问题主要是确定三个:数组元素的初始值、取值点和回溯点;
1.如何判断当前位置的取值满足条件:
假设一个flag变量,每次设值都与前面已经设置好了的皇后的位置进行比较,是否同行同列,同斜线可以使用表达式:a[i]=a[j]=i-j||a[i]-a[j]=j-i
2.什么情况下成功找到四皇后的摆放位置:
当flag=1并且i=4,也就是当前设值的位置已经是最后一个皇后了并且设置的位置也能满足条件
3.什么情况下四个皇后还没有全部确定完,还需要进行查找下一个:
当flag=1并且i<4时,这时候还有皇后没有确定位置,还需要进行查找
4.什么情况下进行回溯:
当flag=0时并且a[i]=4并且i>1时,flag=0表示当前位置的值不能满足,a[i]=4表示当前位置所有的值都设置过了仍然没有满足条件的,i>1表示还可以进行回溯,如果i=1时表示它是第一个皇后,就没有进行回溯的对象了,那程序就可以终止了
5.什么情况下探索完毕,程序终止:
当a[i]=4并且i=1时,已经没有回溯的对象了,这时候程序就终止了
3.实现代码:
//四皇后问题实现代码
public static void queen(){
int i=1;
int a[] = new int[5];
//初始化第一行第一列放第一个皇后
a[i] = 1;
while(true){
//判断当前位置假定的值是否重复
int g = 1;
for(int j=1; j<i; j++){
if(a[i] == a[j] || a[i]-a[j] == i-j || a[i]-a[j] == j-i){
g = 0;
break;
}
}
//已找到结果时输出
if(g == 1 && i == 4){
for(int x=1; x<=4; x++){
System.out.print(a[x]);
}
System.out.println();
break;
}
//当前满足条件但是四个皇后还没排完
if(g == 1 && i < 4){
a[++i] = 1;
continue;
}
//回溯的条件
while(a[i] == 4 && i > 1)
i--;
//回溯的终点
if(i == 1 && a[i] == 4){
break;
}
else{
a[i]++;
}
}
}