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

来源:互联网 发布:c 编程培训中心 编辑:程序博客网 时间:2024/06/05 03:15

//题意, 给你一个目前的状态, 问一个人是否可以在两步之内获胜, (现在该他, 然后对手, 然后再是他).
直接模拟下棋判一下是否可以赢就是了. 即第一次下完了以后, 他是否还有两种赢的状态, 有就一定会赢, 否则就不能赢.(和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();    }}
原创粉丝点击