数据结构与算法 -- 回溯算法
2020-12-13 03:13
标签:boolean style 调用 一个 sys str -- col call() 1、八皇后问题 数据结构与算法 -- 回溯算法 标签:boolean style 调用 一个 sys str -- col call() 原文地址:https://www.cnblogs.com/jiangwangxiang/p/11071027.html//8皇后问题--回溯算法
public class Recall {
int[] result = new int[8];//全局或成员变量,下标表示行,值表示queue存储在哪一列
public static void main(String[] args) {
Recall recall = new Recall();
recall.cal8queues(0);
}
public void cal8queues(int row) {//调用方式:cal8queues(0)
if(row == 8) {//8个棋子都放置好了,打印结果
printQueues(result);
return;//8行棋子都放好了,已经没法再往下递归了,所以就return
}
for(int column=0; column8; column++) {//每一行都有8种放法
if(isOk(row, column)) {//有些放法不满足要求
result[row] = column;//第row行的棋子放到了column列
cal8queues(row+1);//考察下一行
}
}
}
private boolean isOk(int row, int column) {//判断row行column列放置是否合适
int leftup = column-1, rightup = column+1;
for(int i=row-1; i>=0; i--) {//逐行往上考察每一行
if(result[i] == column) {
return false;//第i行的column列有棋子吗?
}
if(leftup >= 0) {//考察左上对角线:第i行leftup列有棋子吗?
if(result[i] == leftup) {
return false;
}
}
if(rightup 8) {//考察右上对角线:第i行rightup列有棋子吗?
if(result[i] == rightup) {
return false;
}
}
leftup--;
rightup++;
}
return true;
}
private void printQueues(int[] result) {//打印一个二维矩阵
for(int row=0; row8; row++) {
for(int column=0; column8; column++) {
if(result[row] == column) {
System.out.print("Q");
}else {
System.out.print("*");
}
}
System.out.println();
}
System.out.println();
}
}