1. 程式人生 > >[Java] 藍橋杯ADV-203 演算法提高 8皇后·改

[Java] 藍橋杯ADV-203 演算法提高 8皇后·改

問題描述規則同8皇后問題,但是棋盤上每格都有一個數字,要求八皇后所在格子數字之和最大。輸入格式一個8*8的棋盤。輸出格式所能得到的最大數字和樣例輸入1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 4848 50 51 52 53 54 55 5657 58 59 60 61 62 63 64樣例輸出260資料規模和約定棋盤上的數字範圍0~99

package adv203;

import java.util.Scanner;

public class Main {
    private static int[][] cheese = new int[8][8];

    private static int[] pos = new int[8];

    private static int maxValue = 0;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                cheese[i][j] = in.nextInt();
            }
        }
        in.close();
        dfs(0, 0);

        System.out.println(maxValue);
    }

    private static boolean isOk(int row) {
        for (int i = 0; i < row; i++) { if (pos[row] == pos[i] || row - i == Math.abs(pos[row] - pos[i])) { return false; } } return true; } private static void dfs(int row, int maxTempValue) { if (row >= 8) {
            maxValue = Integer.max(maxValue, maxTempValue);
            return;
        }

        for (pos[row] = 0; pos[row] < 8; pos[row]++) {
            if (isOk(row)) {
                dfs(row + 1, maxTempValue + cheese[row][pos[row]]);
            }
        }
    }
}