ACM集训之排位赛三:模拟题 【USACO】Team Tic Tac Toe

版权声明:本文为博主原创文章,转载请注明出自CSDN Authur_gyc https://blog.csdn.net/WHY995987477/article/details/88585234

【USACO】Team Tic Tac Toe
http://cache.baiducontent.com/c?m=9d78d513d98516fc07fa940f4b4d86711925c6306dc0d0643989c45cd424054e1d20a5f930236319ce98247001d80c07b3a77665377471eb868ac8178de5c577388850762a5e914066884fb8ca3024c72794&p=99759a46d6c65bb10be2963e5a0a9c&newp=9166d65385cc43f607bd9b7d0d13c4231610db2151d4d5126b82c825d7331b001c3bbfb423261401d8c6796202aa4e5cebf33776300021a3dda5c91d9fb4c57479d178&user=baidu&fm=sc&query=Team+Tic+Tac+Toe&qid=c25580f000009330&p1=10

题意

3*3的地图,很小个,直接模拟。
单人赛,如果有人占了整一行或者整一列或者一条对角线,那么他赢了。
双人组队赛,如果两个人共同占了整一行或者整一列或者一条对角线,那么他们两个赢了。(要注意的是,如果只由一个人满足上述条件那是不算的,也就是说,一个人抱另一个人的大腿是不算数的,必须由两个人组成)

思路

这道题模拟就可以解决,判断一下每行每列以及两条对角线,分别给出所有单人赛和所有的双人组队赛能赢的个数。
但是这道题的代码量很大,在打的过程中一直怀疑:真的是这样做的吗?然后各种删了写、写了删。

反思

又是一道理解错题意的题,以为一个人抱另一个人的大腿也能够取得胜利。
代码量很大,把我吓到了,对自己产生怀疑。
做题要整理好思路评估自己想法的可行性,然后坚定的去执行

代码

#include<cstdio>
#include<cstdlib>
#include<cstring> 
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
char mp[10][10];
int a[300];
char color[15];
int crx(char b)
{
	for(int i=0;i<3;i++)
	{
		if(b==mp[i][0]&&b==mp[i][1]&&b==mp[i][2])
			return 1;
		if(b==mp[0][i]&&b==mp[1][i]&&b==mp[2][i])
			return 1;
	} 
	if(b==mp[0][0]&&b==mp[1][1]&&b==mp[2][2])
		return 1;
	if(b==mp[0][2]&&b==mp[1][1]&&b==mp[2][0])
		return 1;
	return 0;
}
int crx2(char a,char b)
{
	//组队必须要两人,一个人的不算 
	for(int i=0;i<3;i++)
	{
		if((b==mp[i][0]||a==mp[i][0])&&(b==mp[i][1]||a==mp[i][1])&&(b==mp[i][2]||a==mp[i][2]))
			if(mp[i][0]!=mp[i][1]||mp[i][1]!=mp[i][2]||mp[i][0]!=mp[i][2])
				return 1;
		if((b==mp[0][i]||a==mp[0][i])&&(b==mp[1][i]||a==mp[1][i])&&(b==mp[2][i]||a==mp[2][i]))
			if((mp[0][i]!=mp[1][i])||(mp[0][i]!=mp[2][i])||(mp[2][i]!=mp[1][i]))
				return 1;
	} 
	if((b==mp[0][0]||a==mp[0][0])&&(b==mp[1][1]||a==mp[1][1])&&(b==mp[2][2]||a==mp[2][2]))
		if((mp[0][0]!=mp[1][1])||(mp[1][1]!=mp[2][2])||(mp[0][0]!=mp[2][2]))
			return 1;
	if((b==mp[0][2]||a==mp[0][2])&&(b==mp[1][1]||a==mp[1][1])&&(b==mp[2][0]||a==mp[2][0]))
		if((mp[0][2]!=mp[1][1])||(mp[1][1]!=mp[2][0])||(mp[0][2]!=mp[2][0]))
			return 1;
	return 0;
}
int main()
{
	for(int i=0;i<3;i++)
		scanf("%s",&mp[i]);
	//取颜色 
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			a[mp[i][j]]=1;
	int cnt=0;//颜色个数 
	for(int i=0;i<256;i++)
		if(a[i]==1)
			color[++cnt]=i;
	
	//单人 
	int ans=0;
	for(int i=1;i<=cnt;i++)
		if(crx(color[i]))
			ans++;
	printf("%d\n",ans);
	//双人
	ans=0;
	for(int i=1;i<cnt;i++)
		for(int j=i+1;j<=cnt;j++) 
			if(crx2(color[i],color[j]))
				ans++;
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WHY995987477/article/details/88585234
今日推荐