问题描述
在8×8格的国际象棋上摆放八个皇后棋子,即任意两个棋子都不能处于同一行、同一列或同一斜线上,问有多少种摆法?(共92种方法)
思路
存储:用一维数组存储位置,索引为横坐标,值为纵坐标
检测:同一行不需要检测;
同一列 arr[i] == arr[n];
同一斜线 Math.abs(arr[n] - arr[i]) == Math.abs(n - i);
下棋:每次递归前判断是否到第八个棋子,是,则退出。
每个棋子都要从行首到行尾全部判断一次
代码
class EightQueens {
int[] arr = new int[8];//一维数组用于存储棋子位置,索引为横坐标,值为纵坐标
int count = 0;
@Test
public void test() {
chess(0);
System.out.println("共" + count + "个解法");
}
//放置棋子(递归)
public void chess(int n) {
if(n == 8) {//如果到最后,就结束
print();
return;
}else {
for(int i = 0; i < 8; i ++) {
//从第一个棋子开始放置
arr[n] = i;//1-8循环检测
if(check(n)) {//判断该棋子位置是否正确
chess(n+1);//正确,则放下一个棋子
}//不正确,则进入下一个for循环
}
}
}
//检测位置是否正确(同一行、同一列、同一斜线)
public boolean check(int n) {
for(int i = 0; i < n; i ++) {
if(arr[i] == arr[n] || Math.abs(arr[n] - arr[i]) == Math.abs(n - i)) {
return false;
}
}
return true;
}
//遍历
public void print() {
count ++;
System.out.print("解法" + count + ":\t");
for(int i = 0; i < arr.length; i ++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
结果为92种算法