CF3C Tic-tac-toe

· · 题解

AC 后逛了逛题解,发现好像自己的代码比大佬都短很多?

思路

数据范围很小,先暴力求得 X0. 的个数,然后暴力求得连着的三个 X0 的个数。

然后,我们来分类讨论:

总结:情况较多,比较麻烦,但是数据范围很小。

AC code

#include<bits/stdc++.h>
using namespace std;
char ch[4];
int m[4][4],num[3],win[3];
int main()
{
    for(int i=1;i<=3;++i)
    {
        scanf("%s",ch+1);
        for(int j=1;j<=3;++j) m[i][j]=(ch[j]=='X')?1:(ch[j]=='0')?2:0,++num[m[i][j]];//统计每个情况的个数 
    }
    /*统计两人能获胜的个数*/ 
    for(int i=1;i<=3;++i) if(m[i][1]==m[i][2]&&m[i][2]==m[i][3]) ++win[m[i][1]];//同行相同 
    for(int j=1;j<=3;++j) if(m[1][j]==m[2][j]&&m[2][j]==m[3][j]) ++win[m[1][j]];//同列相同 
    if(m[1][1]==m[2][2]&&m[2][2]==m[3][3]) ++win[m[1][1]];//斜角相同 
    if(m[3][1]==m[2][2]&&m[2][2]==m[1][3]) ++win[m[3][1]];//斜角相同
    /*非法情况*/
    if(win[1]&&win[2]) printf("illegal"),exit(0);
    if(num[1]!=num[2]&&num[1]!=num[2]+1) printf("illegal"),exit(0);
    if(win[2]&&num[1]==num[2]+1) printf("illegal"),exit(0);
    if(win[1]&&num[1]==num[2]) printf("illegal"),exit(0);
    /*某人赢的情况*/
    if(win[1]) printf("the first player won"),exit(0);
    if(win[2]) printf("the second player won"),exit(0);
    /*该某人下棋的情况*/
    if(num[1]==num[2]) printf("first"),exit(0);
    if(num[1]==num[2]+1&&num[0])printf("second"),exit(0);
    /*平局情况*/
    printf("draw");
    return 0;
}