八皇后问题介绍:
此图来源于百度百科哈~~~
简单的来说就是有一个8*8的棋盘,需要将8颗代表皇后的棋子有规则地摆上。规则是任意两个皇后不能处在同一行,同一列或者同一斜线上,列出所有不同的解法。
解题思路:
1.第一个皇后放在第一排第一列。
2.第二个皇后放在第二行第一列,然后判断是否ok,如果不ok,继续放在第二列,第三列,依次把所有列都放完,直到找到一个合适的点。
3.继续第三个皇后,依旧按照第二点的原则,指导第八个皇后也存在一个不冲突的点,则算是找到了一个正确的解。
4.当得到一个正确的解时,在栈回退到上一个栈空间(这里所说的回退栈空间就是指回退到上一个皇后,然后将上一个皇后平移一个位置)开始回溯,直到第一个皇后,此时到第一排的第一个位置的所有解就都得到了。
5.最后就是第一个皇后放在第一排第二列...最后一列。
下面是代码实现:
设计一个类用来实现本次代码,利用数组的两个属性,(索引,值)即索引代表行数,指代表列数
// 皇后的个数
int max = 8;
// 记录正确解的个数
int count = 0;
// 数组用来存放结果
int[] arr = new int[max];
这里设计 三个方法,判断是否之前的皇后冲突的方法;输出方法;递归方法;
冲突方法主要是根据传进来的行号也就是数据的索引值,得到当前棋局中的皇后的具体位置,利用循环判断是否与之前的皇后位置冲突。
递归方法主要是设计一个打破递归的条件,即第八颗棋子也被安排了一个列数就是当递归调用本深的第八回。可以理解为一个数的结构当然这里不是指的二叉树,就是一个模拟的树结构,在每个分叉的分支均循环了八次。这样在每次找到最终解的时候都可以输出正确的解。
public void check(int n) {
if (n == max) {
show();
return;
}
for (int i = 0; i < max; i++) {
arr[n] = i;
if (judge(n)) {
check(n + 1);
}
}
}
// 判断当前皇后是否与之前的皇后冲突
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
// 数组中的值代表的是列数
// n或者i代表的是行数 22 33 13 24
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
// 输出当前数组的方法
public void show() {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
count++;
System.out.println();
}
最后时程序的运行结果: