回溯法——8皇后问题
一、实验内容
1.问题描述
要求用回溯法求解8 —— 皇后问题,是放置在8*8棋盘上的8个皇后彼此不收攻击,即:任何两个皇后都不在同一行、同一列和同一斜线上。
请输出8皇后问题所有可行解。
2、要求
(1)写出问题分析过程
(2)写出程序代码
(3)写出程序运行结果
二、程序代码
package huisu;
public class Queen {
/*
* 一共有多少个皇后(此时设置为8皇后在8*8棋盘,可以修改此值为N皇后
*/
int max= 8;
static long sum=0;
/*
* 该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列,
*/
int [] array = new int[max];
public static void main(String[] args) {
new Queen().check(0);
System.out.println("一共有:"+sum+"个可行解");
}
/*
* n代表当前是第几个皇后
* @param n
* 皇后n在array[n]列
*/
private void check(int n) {
//终止条件是最后一行已经摆完,由于每摆一步都会教研是否有冲突,所以就进行下一行逻辑
if(n==max)
{
sum++;
print();
return;
}
for(int i=0;i<max;i++)
{
array[n] = i;
if(judge(n)) {
check(n+1);
}
}
}
private boolean judge(int n) {
for(int i=0;i<n;i++)
{
if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i] )) {
return false;
}
}
return true;
}
private void print() {
for(int i=0; i < array.length;i++)
{
System.out.print(array[i]+1+" ");
}
System.out.println();
}
}
三、程序运行结果