八皇后代码学习
package recursion;
public class EightQuene {
private int max = 8;
//一个一维数组,下标0-7代表8行(0-7行),每个数组的值代表第几列0-7列
private int arr[] = new int[max];
public static void main(String[] args) {
EightQuene e = new EightQuene();
e.let(0);
}
/*通过调试发现,在放置每一行的时候,
首先放第一列然后去跟前面几行放过的皇后比较判断
如果放该列的判断结果成立不矛盾,就放下一个皇后,否则就移动该行的皇后到下一列在进行判断。
这个过程是在let的for循环中进行的。如果某一行放到了最后一列而仍然没有放完8个皇后,这一行
所在的let方法结束,就开始回溯到放上一行的let方法中,此时就会移动上一行的皇后到下一列直到
判断满足不矛盾,又会放下一行的皇后。依次类推,直到放第八个皇后的时候判断前七个都满足, 这时候就会打印一次结果。
然后又回溯到前一个let方法,改变这一行的位置,这一行的let方法结束,
又回溯到前一行去移动位置,然后满足条件又放下一行,直到再次放到第八个皇后,再次打印结果。
依次循环,第一个皇后的位置分别放8列共对应92种方式。
* */
//放置
public void let(int n) {
if (n == max) {
show();
return;
}
for (int j = 0; j < max; j++) { arr[n] = j;
if (judge(n)) {
let(n + 1);
}
}
}
//判断是否位置正确
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
//第一个==是i行与n行在一列,n-i是行差,arr[i]-arr[n]是列差,等于是在斜角上
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] + "");
System.out.println();
}
}
此博客用于个人学习,尚硅谷教师