问题描述
规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入
一个8*8的棋盘。
输出
所能得到的最大数字和
解法:回溯选择最优
思路:
(1)当8行都符合八皇后的规则后,计算方案数在棋盘上的值
(2)值越大就取
代码
/**
* 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
* 解法:在八皇后的基础上增加比较条件
*/
public class Main {
/* 输入的棋盘 */
static int[][] arr = new int[8][8];
/* 最大和 */
static long result = Integer.MIN_VALUE;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
arr[i][j] = scanner.nextInt();
}
}
int[] idea = new int[8];
maxQueen(idea, 0, 8);
System.out.println(result);
}
/**
* 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
* @param idea 存放一个方案的数组
* @param i 当前试探的行数
* @param n 总函数
*/
private static void maxQueen(int[] idea, int i, int n) {
if(i == n){
int number = calculate(idea);
result = Math.max(number, result);
}else {
// 在当前的每列试探放置皇后
for (int j = 0; j < n; j++) {
idea[i] = j;
// 判断当前试探的位置是否符合八皇后规则
if(judge(idea, i)){
maxQueen(idea, i + 1, n);
}
}
}
}
/**
* 计算按照idea放置的和
*/
private static int calculate(int[] idea) {
int result = 0;
for (int i = 0; i < 8; i++) {
result += arr[i][idea[i]];
}
return result;
}
/**
* 判断已经放置的皇后位置是否可行
*/
private static boolean judge(int[] idea, int i) {
for (int ii = 0; ii < i; ii++) {
// 同列 || 主斜线 || 副斜线
if(idea[i] == idea[ii] || i - ii == idea[i] - idea[ii] || i - ii == idea[ii] - idea[i]){
return false;
}
}
return true;
}
}