三子棋(京东2016实习生真题)

来源:互联网 发布:发票二维码扫描软件 编辑:程序博客网 时间:2024/05/16 13:45
题目描述

三子棋是一种大家熟知的游戏,几乎所有人都会玩。游戏规则相当简单,两人依次在一个3X3棋盘格上下棋,一个人画叉,另一个人画圈。任何一个人画的三个记号如果形成构成一条水平、垂直或对角的直线则获胜,游戏结束。画叉的人先开始游戏,如果所有的棋盘格都画满了但两人都不能获胜,则游戏平局结束。


游戏在一个3X3的棋盘上进行,每个棋盘格单元处于空白、画叉或画圈状态中的一种,你的任务是确定下一轮由谁下棋:

1:轮到先手下棋;

2:轮到后手下棋;


或者是判定游戏的状态:

x:给定的棋局不是合法的棋局;

1 won:先手获胜;

2 won:后手获胜;

Draw:平局;


小东对棋类游戏很有研究,这一次三子棋比赛中,她被邀请作为评判,为了提携后进,她请你帮忙判定。


输入

输入中有多组测试数据。每组测试数据包含三行,每行均由字母“.”、“X”、“0”构成,“.”代表空白、“X”代表画叉、“0”代表画圈。

样例输入

X0X

.0.

.X.


输出

对每组测试数据,在单独的一行中输出六种评判结果之一:1, 2, x, 1 won, 2 won, draw。 

样例输出

2

时间限制C/C++语言:1000MS其它语言:3000MS
内存限制C/C++语言:65536KB其它语言:589824KB
题目坑点比较多,主要是关于怎样的棋局是不合法的,这里坑点最多我WA了很多次。
ac代码如下:
/*注意点一: x 赢的条件   1.形成 三个x  2.x=o+10 赢的条件   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. 000return 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;} 






0 0