Skip to content

Pro4

原始文件为 CPP 代码,本文是转换后的 Markdown 文件。

#include <bits/stdc++.h>

using namespace std;

int save[3][3];

bool raw_ok(int p) 
{
    for(int i = 0; i < 3; ++i)
        if(save[i][0] == save[i][1] && save[i][0] == save[i][2] && save[i][0] == p) return true;
    return false;
}
bool col_ok(int p)
{
    for(int i = 0; i < 3; ++i)
        if(save[0][i] == save[1][i] && save[0][i] == save[2][i] && save[0][i] == p) return true;
    return false;
}
bool dia_ok(int p)
{
    bool flag1 = (save[0][0] == save[1][1] && save[0][0] == save[2][2] && save[0][0] == p);
    bool flag2 = (save[0][2] == save[1][1] && save[0][2] == save[2][0] && save[0][2] == p);
    return flag1 || flag2;
}

bool is_over(int player)
{
    return (raw_ok(player) || col_ok(player) || dia_ok(player));
}

int blank()
{
    int result = 0;
    for(int i = 0; i < 9; ++i) if(save[i/3][i%3] < 0) ++result; 
    return result;
}

int win_count(int player)
{
    int result = blank();
    return !player ? (result + 1) : -(result + 1);
}

int alphabeta(int player, int alpha, int beta)
{
    // printf("alphabeta(%d, %d, %d)\n", player, alpha, beta);
    if(is_over(!player)) return win_count(!player);
    if(blank() == 0) return 0;

    for(int i = 0; i < 9; ++i)
    {
        if(save[i/3][i%3] >= 0) continue;
        save[i/3][i%3] = player;

        int v = alphabeta(player^1, alpha, beta);
        if(!player) alpha = max(alpha, v); else beta = min(beta, v);

        save[i/3][i%3] = -1;
        if(beta <= alpha) break;
    }

    return !player ? alpha : beta;
}

int main(void)
{
    // freopen("in.txt", "r", stdin);
    int T; scanf("%d", &T);
    for(int i = 0; i < T; ++i)
    {
        bool empty = true;
        memset(save, 0, sizeof(save));
        for(int i = 0; i < 9; ++i)
        {
            scanf("%d", &save[i/3][i%3]);
            if(save[i/3][i%3]) empty = false;
            --save[i/3][i%3];
        }
        if(is_over(0)) printf("%d\n", win_count(0));
        else if(is_over(1)) printf("%d\n", win_count(1));
        else if(empty) printf("0\n");
        else printf("%d\n", alphabeta(0, -100, 100));
    }

    return 0;
}