[CF3C] Tic-tac-toe

【题目描述】
显然,我们每个人都熟悉Tic-tac-toe游戏。

这个游戏的规则是:两个人依次在3X3的棋盘上下棋。

当一个人有3个棋子连成一行或一列或一纵列时,则这个人已经获得胜利。这时则停止下棋。第一个人先下,第二个人后下。

现在,请你判断一游戏的状态。

first,现在轮到第一个人下。

second,现在轮到第二个人下。

the first player won,如果第一个人刚刚赢得比赛。

the second player won,如果第二个人刚刚赢得比赛。

illegal,如果这种棋局不可能出现。

draw,如果棋盘已经下满且无法分出胜负。

【输入】
一个3X3的矩阵,用X和.和0表示。

X表示第一个人的棋子,0表示第二个人的棋子。

.表示该位置还未下。

【输出】
一个字符串,即上述六种状态的一种。

【输入样例】

X0X
.0.
.X.

【输出样例】

second

【数据范围】
30(3个点) 答案只含有first,second和draw

70(7个点) 答案只含有其他3种情况

时间限制 : 1s

空间限制 : 256M

极其繁琐的分类讨论。
先看一下怎么样子是不可能的。首先如果两个人的棋子数量差距太大,肯定是不对的。准确的说,如果先手比后手多出超过1个或者后手比先手多,那就不合法。同时,如果两个人都赢了,本来一个人一赢游戏就停止,所以也不合法。
平局的情况好像也很简单,如果棋盘满了并且没有人赢,那就平局。
剩下的要先看一下有没有人赢,如果有那么就输出他赢了,否则就看一下先手是否比后手多,判断下一个是谁就好了。

#include<iostream>
using namespace std;
char c[5][5];
int cnt1,cnt2,f1,f2;
int main()
{
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
			cin>>c[i][j];
	cnt1=cnt2=0;
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(c[i][j]=='0')
				cnt1++;
			if(c[i][j]=='X')
				cnt2++;
		}
	}
	if(cnt1>cnt2||cnt2-cnt1>1)
	{
		cout<<"illegal";
		return 0;
	}
	if(c[1][1]=='0'&&c[2][1]=='0'&&c[3][1]=='0')
		f1=1;
	if(c[1][2]=='0'&&c[2][2]=='0'&&c[3][2]=='0')
		f1=1;
	if(c[1][3]=='0'&&c[2][3]=='0'&&c[3][3]=='0')
		f1=1;
	if(c[1][1]=='0'&&c[1][2]=='0'&&c[1][3]=='0')
		f1=1;
	if(c[2][1]=='0'&&c[2][2]=='0'&&c[2][3]=='0')
		f1=1;
	if(c[3][1]=='0'&&c[3][2]=='0'&&c[3][3]=='0')
		f1=1;
	if(c[1][1]=='0'&&c[2][2]=='0'&&c[3][3]=='0')
		f1=1;
	if(c[1][3]=='0'&&c[2][2]=='0'&&c[3][1]=='0')
		f1=1;
	if(c[1][1]=='X'&&c[2][1]=='X'&&c[3][1]=='X')
		f2=1;
	if(c[1][2]=='X'&&c[2][2]=='X'&&c[3][2]=='X')
		f2=1;
	if(c[1][3]=='X'&&c[2][3]=='X'&&c[3][3]=='X')
		f2=1;
	if(c[1][1]=='X'&&c[1][2]=='X'&&c[1][3]=='X')
		f2=1;
	if(c[2][1]=='X'&&c[2][2]=='X'&&c[2][3]=='X')
		f2=1;
	if(c[3][1]=='X'&&c[3][2]=='X'&&c[3][3]=='X')
		f2=1;
	if(c[1][1]=='X'&&c[2][2]=='X'&&c[3][3]=='X')
		f2=1;
	if(c[1][3]=='X'&&c[2][2]=='X'&&c[3][1]=='X')
		f2=1;
	if(f1&&f2)
	{
		cout<<"illegal";
		return 0;
	}
	if(cnt1+cnt2==9&&!f1&&!f2)
	{
		cout<<"draw"<<endl;
		return 0;
	}
	if(f1)
		cout<<"the second player won";
	else if(f2)
		cout<<"the first player won";
	else if(cnt1==cnt2)
		cout<<"first";
	else if(cnt2>cnt1)
		cout<<"second";
	return 0;
}
posted @   灰鲭鲨  阅读(410)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示