CCF-201803-4-棋局评估

import java.util.Scanner;

public class Main {
    private static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        int T;
        while (in.hasNext()) {
            T = in.nextInt();
            int[][] array = new int[3][3];
            for (int i = 0; i < T; i++) {
                input(array);
                // print();
                int x = win(1, array), y = win(2, array);
                if (x != 0) {
                    System.out.println(x);
                    continue;
                }

                if (y != 0) {
                    System.out.println(y);
                    continue;
                }

                System.out.println(dfs(0, array));
            }

        }
    }

    private static int dfs(int peo, int[][] array) {
        if (spa(array) == 0) {
            return 0;
        }
        int Max = -10, Min = 10;
        for (int i = 0; i < 3; i++) {
            for (int j = 0, w; j < 3; j++) {
                if (array[i][j] == 0) {
                    array[i][j] = peo + 1;
                    w = win(peo + 1, array);
                    if (w != 0) {
                        array[i][j] = 0;
                        return w > 0 ? Math.max(Max, w) : Math.min(Min, w);
                    }
                    if (peo == 0) {
                        Max = Math.max(Max, dfs(1, array));
                    } else {
                        Min = Math.min(Min, dfs(0, array));
                    }
                    array[i][j] = 0;
                }
            }
        }

        return (peo != 0) ? Min : Max;
    }

    private static int win(int f, int[][] array) {
        int wi = 0, ans = 1;
        if (hok(0, f, array) || hok(1, f, array) || hok(2, f, array)) {
            wi = 1;
        }
        if (lok(0, f, array) || lok(1, f, array) || lok(2, f, array)) {
            wi = 1;
        }

        if (array[0][0] == f && array[0][0] == array[1][1] && array[1][1] == array[2][2]) {
            wi = 1;
        }

        if (array[0][2] == f && array[0][2] == array[1][1] && array[1][1] == array[2][0]) {
            wi = 1;
        }
        if (wi == 0) {
            return 0;
        }
        ans += spa(array);
        return (f == 1) ? ans : -ans;
    }

    private static boolean lok(int l, int f, int[][] array) {
        return array[0][l] == f && array[0][l] == array[1][l] && array[1][l] == array[2][l];
    }

    private static boolean hok(int h, int f, int[][] array) {
        return array[h][0] == f && array[h][0] == array[h][1] && array[h][1] == array[h][2];
    }

    private static int spa(int[][] array) {
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (array[i][j] == 0) {
                    sum++;
                }
            }
        }
        return sum;
    }

    private static void input(int[][] array) {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                array[i][j] = in.nextInt();
            }
        }
    }
}

 

posted on 2018-08-08 14:57  NEU-2015  阅读(937)  评论(0编辑  收藏  举报

导航