poj-2361

解题思路:由于X先走并且两个人轮流执子,所以当网格图无效的时候,存在下列5种情况:

  (1)O的个数大于X

  (2)X的个数至少比O大2

  (3)O和X同时赢

  (4)X赢,但是双方的棋子数一样

  (5)O赢,但是双方棋子数不同

 技巧:用一个标志位flag来判断是否合法,尤其注意掌握判断行、列、对角线的元素是否相同的方法,技巧性较强。

#include<stdio.h>
char plant[4][4];
int i,j;
//判断是否赢 
int win(char c)
{
	for(i=0;i<3;i++)
	{	//判断一行是否相同 
		for(j=0;j<3 && plant[i][j]==c;j++)
			if(j==2) return 1;
		//判断一列是否相同 
		for(j=0;j<3 && plant[j][i]==c;j++)
			if(j==2) return 1;
	}
	//判断主对角线是否相同 
	for(i=0;i<3 && plant[i][i]==c;i++)
		if(i==2) return 1;
	//判断次对角线是否相同 
	for(i=0;i<3 && plant[i][2-i]==c;i++)
		if(i==2) return 1;
	return 0;
}

int main()
{
	 int flag;//用来标注是否合法 
	 int n,xcount,ocount;
	 while(scanf("%d",&n)!=EOF)
	 {
	 	getchar();
	 	while(n--) 
	 	{
	 		xcount=0;
			 ocount=0; 
	 		for(i=0;i<3;i++)		//输入网络 
	 			scanf("%s",plant[i]);
	 		flag=1; 
	 		//计算X和O出现的次数,判断是否合法提供依据 
	 		for(i=0;i<3;i++)
	 		{
	 			for(j=0;j<3;j++)
	 			{
	 				if(plant[i][j]=='X')
	 					xcount++;
	 				else if(plant[i][j]=='O')
	 					ocount++;
				}
	  		}
	 		//两个人同时赢 
	    	if(win('X') && win('O'))
				flag=0;
			//X赢了,但是双方棋子一样多 
			if(win('X') && xcount==ocount) 
				flag=0;
			//O的个数大于X 或者X的数目比O大至少2个 
			if(ocount>xcount ||xcount-ocount>1)
	 			flag=0;
	 		//判断O赢,但是双方棋子不等 
	 		if(win('O') && ocount!=xcount)
	 			flag=0;
	 		//判断X赢,但是双方棋子个数相同 
			if(win('X') && ocount==xcount)
	 			flag=0;	
	 		if(flag)
	 			printf("yes\n");
	 		else
	 			printf("no\n");	 
		}	 	
	 }
	 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值