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

题目描述
									

三子棋是一种大家熟知的游戏,几乎所有人都会玩。游戏规则相当简单,两人依次在一个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+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;
} 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值