输入
输入中有多组测试数据。每组测试数据包含三行,每行均由字母“.”、“X”、“0”构成,“.”代表空白、“X”代表画叉、“0”代表画圈。
|
|
输出
对每组测试数据,在单独的一行中输出六种评判结果之一:1, 2, x, 1 won, 2 won, draw。
|
|
时间限制
C/C++语言:1000MS
其它语言:3000MS
|
内存限制
C/C++语言:65536KB
其它语言:589824KB
|
题目坑点比较多,主要是关于怎样的棋局是不合法的,这里坑点最多我WA了很多次。
/*
注意点一:
x 赢的条件 1.形成 三个x 2.x=o+1
0 赢的条件 1.形成 三个0 2.0=x
注意点二:
两个人不可能同时赢
*/
#include<stdio.h>
char a[3][3];
int check(int x,int o){
int cas=0;
int i=0;
int flag1=0;
int flag2=0;
for(i=0;i<3;i++){
if((a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][2]=='X')||(a[0][i]==a[1][i]&&a[1][i]==a[2][i]&&a[2][i]=='X')){
cas=4;
flag1=1;
}else if((a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][2]=='0')||(a[0][i]==a[1][i]&&a[1][i]==a[2][i]&&a[2][i]=='0')){
cas=5;
flag2=1;
}
}
if((a[0][0]==a[1][1]&&a[1][1]==a[2][2]&&a[2][2]=='X')||(a[0][2]==a[1][1]&&a[1][1]==a[2][0]&&a[2][0]=='X')){
cas=4;flag1=1;
}else if((a[0][0]==a[1][1]&&a[1][1]==a[2][2]&&a[2][2]=='0')||(a[0][2]==a[1][1]&&a[1][1]==a[2][0]&&a[2][0]=='0')){
cas=5;flag2=1;
}
if(flag1&&flag2){//两人不可能同赢 p!=0时漏掉了不合法情况 xxx ... 000
cas=3;
}
if(flag1==1&&x!=o+1){
cas=3;
}
if(flag2==1&&x!=o){
cas=3;//当x>o时,0不可能赢
} //xx. xx. 000
return cas;
}
int main(){
while(scanf("%s",a[0])!=EOF){
int i=0;
int j=0;
int o=0;
int x=0;
int p=0;
int cas=0;
scanf("%s",a[1]);
scanf("%s",a[2]);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]=='0'){
o++;
}else if(a[i][j]=='X'){
x++;
}else{
p++;
}
}
}
if(x==o+1||x==o){
if(p==0){
cas=check(x,o);
if(!cas){
cas=6;
}
}else{
cas=check(x,o);
if(!cas){
if(x>o)cas=2;
if(x==o)cas=1;//p!=0时漏掉了不合法情况 xxx ... 000
}
}
}else{
cas=3;
}
switch (cas){
case 1:printf("1\n");break;
case 2:printf("2\n");break;
case 3:printf("x\n");break;
case 4:printf("1 won\n");break;
case 5:printf("2 won\n");break;
case 6:printf("draw\n");break;
}
}
return 0;
}