问题描述
八八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
一、解法思路
(1)第一个皇后先放置在第一行第一列,
(2)第二个皇后放置在 第二行第一列,判断是否ok,如果不行,则将皇后后移一个位置,依次把所有列尝试
(3)将剩下的皇后按照第二步依次放置,直到放置完最后一个皇后
(4)返回第一行,将第一个皇后往后放置一列,然后重复1,2,3,4操作
二、解决方法
判断皇后的位置运用一维数组。a[i]=n,i代表为第几个皇后,n则代表为多少列
i也同时代表为第几行,因为同行不能有两个皇后,说明皇后的个数也代表为行数
public class queen{
static int max=8;//定义皇后的数量
int []arr=new int[max];//定义一个以为数组来表述第几个皇后,和在第几列
int count=0;//用于记录共有多少中种方法
}
1.先定义一个函数解决如何判断皇后能否放置在这个位置
思想:因为只需要判断列是否相同以及是否在一条斜线上,斜线则通过判断行的差值和列的差值是否一样则可判断出(原理:等腰三角形)
/**
*n为传入的皇后数
*/
public static void judge(int n){
for(int i=0;i<n;i++){//从第一个皇后开始判断
if(arr[i]==arr[n]||Math.abs(i-n)==Math.abs(arr[i]-arr[n])){
return false;
}
}
return true;
}
2.向棋盘中添加元素
代码如下(示例):
/*
* n为从第几个皇后开始
*/
public static void check(int n){
if(n==max){//当n等于最大值的时候,说明已经把最后的一个皇后放置,结束
print();
return ;
}
for(int i=0;i<max;i++){
//将皇后从第一列开始放置
arr[n]=i;
if(judge()){//如果与其他皇后不冲突,则继续调用函数,添加皇后
check(n+1);
}
//如果冲突了,则将皇后摆到下一列执行i++,arr[n]=i的代码
}
}
3.对皇后的摆放位置进行一个遍历
代码如下(示例):
/*
* 打印皇后的摆放位置,因为只有当它到了最后一个皇后摆放才能打印,所以打印次数也就是为八皇后一共有的解法
*/
public void print(){
count++;
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 总结
在思考八皇后的问题时候可以考虑树状思想,
实现算法的回溯是通过for(int i=0;i<max;i++)来实现的,新人小白,有问题请指出,谢谢