FZU --- 2283 Tic-Tac-Toe 【三子棋小模拟】

//题意, 给你一个目前的状态, 问一个人是否可以在两步之内获胜, (现在该他, 然后对手, 然后再是他).
直接模拟下棋判一下是否可以赢就是了. 即第一次下完了以后, 他是否还有两种赢的状态, 有就一定会赢, 否则就不能赢.(和CF一道模拟五子棋的有点像)
AC Code

/** @Cain*/
int n,k;
char a[5][5];

bool check(char x)  //判断当前x棋子再棋盘中是否能赢.
{
    if(x==a[1][1]&&a[1][1]==a[1][2]&&a[1][2]==a[1][3])return true;
    if(x==a[2][1]&&a[2][1]==a[2][2]&&a[2][2]==a[2][3])return true;
    if(x==a[3][1]&&a[3][1]==a[3][2]&&a[3][2]==a[3][3])return true;

    if(x==a[1][1]&&a[1][1]==a[2][1]&&a[2][1]==a[3][1])return true;
    if(x==a[1][2]&&a[1][2]==a[2][2]&&a[2][2]==a[3][2])return true;
    if(x==a[1][3]&&a[1][3]==a[2][3]&&a[2][3]==a[3][3])return true;

    if(x==a[1][1]&&a[1][1]==a[2][2]&&a[2][2]==a[3][3])return true;
    if(x==a[1][3]&&a[1][3]==a[2][2]&&a[2][2]==a[3][1])return true;

    return false;
}

bool Find2(char x)
{
    int ans = 0;
    for(int i=1;i<=3;i++){
        for(int j=1;j<=3;j++){
            if(a[i][j] == '.'){
                a[i][j] = x;
                if(check(x)) ans++;
                a[i][j] = '.';
            }
        }
    }
    if(ans >= 2) return true;
    return false;
}

bool Find1(char x)
{
    for(int i=1;i<=3;i++){
        for(int j=1;j<=3;j++){
            if(a[i][j] == '.'){
                a[i][j] = x;
                if(check(x) || Find2(x))
                    return true;
                a[i][j] = '.';
            }
        }
    }
    return false;
}

void solve()
{
    char s[5];
    for(int i=1;i<=3;i++){
        for(int j=1;j<=3;j++){
            scanf("%s",s);
            a[i][j] = s[0];
        }
    }
    char x,y;
    scanf("%s",s);
    x = s[0];
    if(x == 'o')
        y='x';
    else
        y = 'o';

    if(check(y)) printf("Cannot win!\n");  //目前对手就可以赢.
    if(check(x) || Find1(x))    //目前Kim就可以赢或者走一步会两步后可以赢.
        printf("Kim win!\n");
    else
        printf("Cannot win!\n");
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        solve();
    }
}

你可能感兴趣的:(比较杂的题解)