版权声明:本文为博主原创文章,转载请注明出自CSDN Authur_gyc https://blog.csdn.net/WHY995987477/article/details/88585234
题意
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;
}