题目大意就是给你一个 3*3 棋盘,要你判断 A,B 哪个选手赢了,或者该谁下了,或者平局,或者棋盘不符合规则。
这里分六类 (假设A先走)
1. 输出 the first player won 的条件是,A符合赢的条件(某行或某列或对角线的字符一样),且B不符合赢的条件,且A的步数比B多1,因为A先走的。
2. 输出 thesecond player won 的条件是,B符合赢的条件,且A不符合赢的条件,且A跟B的步数一样。
3. 输出 draw 的条件是,A和B都不符合赢的条件,且A的步数为5,B的步数为4.(满格,其他数字组合的满格不符合规则)
4. 输出 first 的条件是,A和B都不符合赢的条件,且A的步数跟B的一样,就该A走了。
5. 输出 thesecond player won 的条件是,A和B都不符合赢的条件,且A的步数比B多1,就该B走了。
6. 剩下的全是不符合规则的情况,输出 illegal
代码如下:
#include <iostream>
using namespace std;
int main()
{
char ch[9];
bool flag1=false,flag2=false;
int i=1,num0=0,numx=0;
for(;i<=9;++i)
{
cin>>ch[i];
if(ch[i]=='X')
++numx;
else if(ch[i]=='0')
++num0;
}
if((ch[1]==ch[2]&&ch[2]==ch[3]&&ch[3]=='X')||
(ch[4]==ch[5]&&ch[5]==ch[6]&&ch[6]=='X')||
(ch[7]==ch[8]&&ch[8]==ch[9]&&ch[9]=='X')||
(ch[1]==ch[4]&&ch[4]==ch[7]&&ch[7]=='X')||
(ch[2]==ch[5]&&ch[5]==ch[8]&&ch[8]=='X')||
(ch[3]==ch[6]&&ch[6]==ch[9]&&ch[9]=='X')||
(ch[1]==ch[5]&&ch[5]==ch[9]&&ch[9]=='X')||
(ch[3]==ch[5]&&ch[5]==ch[7]&&ch[7]=='X'))
flag1=true;
if((ch[1]==ch[2]&&ch[2]==ch[3]&&ch[3]=='0')||
(ch[4]==ch[5]&&ch[5]==ch[6]&&ch[6]=='0')||
(ch[7]==ch[8]&&ch[8]==ch[9]&&ch[9]=='0')||
(ch[1]==ch[4]&&ch[4]==ch[7]&&ch[7]=='0')||
(ch[2]==ch[5]&&ch[5]==ch[8]&&ch[8]=='0')||
(ch[3]==ch[6]&&ch[6]==ch[9]&&ch[9]=='0')||
(ch[1]==ch[5]&&ch[5]==ch[9]&&ch[9]=='0')||
(ch[3]==ch[5]&&ch[5]==ch[7]&&ch[7]=='0'))
flag2=true;
if(flag1&&!flag2&&numx==num0+1)
cout<<"the first player won";
else if(!flag1&&flag2&&numx==num0)
cout<<"the second player won";
else if(!flag1&&!flag2&&numx==5&&num0==4)
cout<<"draw";
else if(!flag1&&!flag2&&numx==num0)
cout<<"first";
else if(!flag1&&!flag2&&numx==num0+1)
cout<<"second";
else
cout<<"illegal";
return 0;
}