Java算法-八皇后问题
本文旨在在于记录一个百度上看来的算法,算法让我吃惊的地方在于将数组下标的功能发挥的淋漓尽致。八皇后问题常规算法矩阵维护法、递归法、迭代法、手动堆栈法四种。但是本质都是在描述同一行、同一列或同一斜线上(右上到左下,左上到右下)四种关系。在百度上看到的一种算法private
int[] rup =
new
int
[(
2
*
8
)+
1];
//右上至左下是否有皇后和private
int[] lup =
new
int
[(
2
*
8
)+
1
];
//左上至右下是否有皇后仅用两个一维数组就完美的展现出了这种关系。看过后只能感叹自己以前学习不够努力了啊。
具体算法:
public class Queen {
private int[] column;
//同栏是否有皇后,1表示有
private int[] rup;
//右上至左下是否有皇后
private int[] lup;
//左上至右下是否有皇后
private int[] queen;
//解答
private int num;
//解答编号
public Queen() {
column = new int[8+1];
rup = new int[(2*8)+1];
lup = new int[(2*8)+1];
for (int i = 1;
i <= 8;
i++)
column[i] = 0;
for (int i = 1;
i <= (2*8);
i++)
rup[i] = lup[i] = 0;
//初始定义全部无皇后
queen = new int[8+1];
}
public void backtrack(int i) {
if (i > 8) {
showAnswer();
} else {
for (int j = 1;
j <= 8;
j++) {
if ((column[j] == 0) && (rup[i+j] == 0) && (lup[i-j+8] == 0)) {
//若无皇后
queen[i] = j;
//设定为占用
column[j] = rup[i+j] = lup[i-j+8] = 1;
backtrack(i+1);
//循环调用
column[j] = rup[i+j] = lup[i-j+8] = 0;
}
}
}
}
protected void showAnswer() {
num++;
System.out.println("\n解答" + num);
for (int y = 1;
y <= 8;
y++) {
for (int x = 1;
x <= 8;
x++) {
if(queen[y]==x) {
System.out.print("Q");
} else {
System.out.print(".");
}
}
System.out.println();
}
}
public static void main(String[] args) {
Queen queen = new Queen();
queen.backtrack(1);
}
}
【Java算法-八皇后问题】总结:算法是常规的回溯,主要是一维数组表示斜线关系,很是巧妙。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 画解算法(1.|画解算法:1. 两数之和)
- 事件代理
- 八、「料理风云」
- Guava|Guava RateLimiter与限流算法
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 一个选择排序算法