public class EightQueens{
public static void main(String[] args){
int[] array = new int[8];//每一个表示该行第几列 如 array[2] = 8 表示第2+1个皇后,放在第2+1行,第8列
//第一个皇后在第一行,第二个皇后在第二行,第三个皇后在第三行。。。。以此类推
//只需要确定在第x行的第几列
T t = new T();
for(int i = 0;i < array.length ;i++){//默认初始都摆放在1这个位置。
array[i] = 1;
}
t.findWay(array,0,1);//第一个皇后放第1个位置
System.out.println("最终的摆放方法:");
for(int i = 0;i < array.length ;i++){
System.out.print(array[i] + "\t");
}
//
}
}
/*摸索过程 --- 不用看了-------检验第i个皇后与其他皇后都不冲突的方法。
class T{
public boolean findWay(int[]array, n){//放置第n个皇后
//递归结束条件:第i个皇后与其他所有皇后均不冲突。
// array -> {array[0],array[1],array[2]...} //这样写就表示不在同一行上了
// array[0] 、 array[1] ... array[7] 互不相等 // 不在同一列上
// 任意array[m] = n array[j] = k, k-n != j-m , // 不在同一斜杠上
int queennum = array.length;
for(int i = 0 ; i < n-1 ; i++){
//i前面的皇后,举例:n=4,即 array 3 ,那么就要看array 0 1 2
if(array[i] != array[n] && array[i] - array[n] == i - n){
return false;
}
}
for(int i = n + 1 ; i < array.length ; i++){
//i后面的皇后,举例:n=4,即 array 3 ,那么就要看array 4 5 6 7
if(array[i] != array[n] && array[i] - array[n] == i - n){
return false;
}
}
}
}
*/
class T{
public boolean judge(int[]array,int n,int j){//判断第n个皇后位置是否与前n-1个皇后位置冲突. 第一个皇后放在1
if(n == 0){
array[n] = j;
return true;
}else{
for(int i = 0 ; i < n ; i++){
//i前面的皇后,举例:n=4,即 array 3 ,那么就要看array 0 1 2
if(array[i] == array[n] || Math.abs(array[i] - array[n]) == Math.abs(i - n)){
System.out.println("冲突啦 ");
System.out.print("————————冲突错误为:第"+ (i + 1) +"个皇后和第"+ (n + 1) + "个皇后冲突。当前array[" + i + "] = " + array[i] + ", array[" + n + "] = " + array[n] + "\n");
return false;
}
}
System.out.println("无冲突了 ,当前到第"+(n+1)+"个皇后,位置在"+array[n]);
System.out.println("________________________" );
return true;
}
}
public boolean findWay(int[]array, int index,int j){//index第index+1个皇后,j为第一个皇后放的位置。
if(index == 8){
return true;
}else{
for(int i = 0 ;i<100; i++){//不需要回溯时,初始位置都为1,一共需要判断8次,i < 9 - array[index] 即i<8
//需要回溯时,上一个皇后位置为array[index-1],需要判断次数为,8-array[index-1]次,i < 8-array[index-1]
//这里就让他一直循环好了,给出退出条件就行。
if(judge(array,index,j)){//与前index-1个皇后不冲突,返回true
boolean result = findWay(array,index + 1,j);
return true;
}else if(array[index] == 8){//如果,该皇后到了放至第八个,仍然与前面皇后冲突,需要回溯到上一个皇后,改变上一个皇后位置
if(array[index-1] < 8){
//保证不会超过棋盘,小于8时可继续尝试
array[index-1] = array[index-1] + 1;
array[index] = 1;
if(findWay(array,index-1,j)){
return true;
}
}else if(array[index-1]==8){//需要回溯两个皇后时,可能还会有回溯三个、四个这种,但是这边两个就够了
array[index-2] = array[index-2] + 1;
array[index] = 1;
array[index-1] = 1;
if(array[index-2]<8){
if(findWay(array,index-2,j)){
return true;
}
}
}
}else{//初始皇后都放在1,每次冲突与前面皇后冲突位置就加1,如果array[index] == 8,仍然冲突,则要回溯。
System.out.println("i = " + i + " " + "; 八皇后冲突的 array[" + index + "] =" + array[index] + "\t");
array[index] = array[index]+ 1;
System.out.println("i = " + i + " " + "; 调整后的 array[" + index + "] =" + array[index] + "\t");
}
}
return false;
}
}
}
03-29
407
01-14
76
03-07
486
03-12
1万+
10-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交