5. 井字队

题目描述

小刚有26只兔子,恰好她们名字都以不同的字母开头,所以小刚用每只兔子的名字的首字母来指代她——一个A…Z之间的字母。

这些兔子最近沉迷于井字游戏,但是由于她们并不满足只有两只兔子可以一起玩,她们改编了这个游戏,可以让许多兔子可以一块儿玩!就像常规的井字游戏一样,这个游戏是在一块3×3的棋盘上进行的,只是与仅用X和O不同,每个格子用一个A…Z之间的字母标记,表示占有这个格子的兔子名字的首字母。

以下是一个棋盘的例子:

COW

XXO

ABC

这些兔子会在她们迷惑于如何判断胜负之前就占满这九个格子。显然,就像常规的井字游戏一样,如果任何一只兔子占有了一整行、一整列,或是一整条对角线,那么这只兔子就获胜了。然而,由于兔子认为多兔游戏中这并不容易出现,所以她们决定允许兔子组成两兔一队,如果某一行、一列,或是一条对角线仅包含一队的两只兔子的字母,并且同时包含了这两只兔子(不仅仅是一只)的字母,那么这一队就获胜。

请帮助兔子们判断有多少只兔子或是两只兔子组成的队伍可以获胜。注意棋盘上的同一个格子可能在不同兔子或队伍的获胜中均被用到。

输入格式

输入包含三行,每行三个A…Z之间的字符。

输出格式

输出包含两行。第一行,输出能够获胜的单独的兔子的数量。第二行,输出能够获胜的两只兔子组成的队伍的数量。

样例 #1

样例输入 #1

COW
XXO
ABC

样例输出 #1

0
2

提示

在这个例子中,没有单独的兔子可以获得胜利。但是,如果兔子C和兔子X组队,她们可以通过C−X−C对角线获胜。同样地,如果兔子X和O组队,她们可以通过中间一行取胜。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
char p[27][27];
ll n,m,q1,k,q2,T,s[27],s1[27],s2[27][27],u1,u2;
int main()
{
    n++;
    cin>>p[1][n];
    while(p[1][n]!='\n')
    {
        n++;
        scanf("%c",&p[1][n]);
    }
    n--;T=n;
    for(ll i=1;i<=T;i++)
    {
        memset(s,0,sizeof(s)); m=0;
        if(i==1)
        {
            for(ll j=1;j<=T;j++)
            {
                k=int(p[i][j])-64;
                if(s[k]==0)
                {
                    s[k]=1;
                    m=m+1;
                    if(m==1) u1=k;
                    if(m==2) u2=k;
                }
            }
        }
        if(i!=1)
            for(ll j=1;j<=T;j++)
            {
                cin>>p[i][j];
                k=int(p[i][j])-64;
                if(s[k]==0)
                {
                    s[k]=1;
                    m=m+1;
                    if(m==1) u1=k;
                    if(m==2) u2=k;
                }
            }
        if(m==2&&s2[u1][u2]==0&&s2[u2][u1]==0) q2++,s2[u1][u2]=1,s2[u2][u1]=1; 
        if(m==1&&s1[k]==0) q1++,s1[k]=1;
    }
    for(ll i=1;i<=T;i++)
    {
        memset(s,0,sizeof(s)); m=0;
        for(int j=1;j<=T;j++)
        {
            k=int(p[j][i])-64;
            if(s[k]==0)
            {
                s[k]=1;
                m=m+1;
                if(m==1) u1=k;
                if(m==2) u2=k;
            }
        }
        if(m==2&&s2[u1][u2]==0&&s2[u2][u1]==0) q2++,s2[u1][u2]=1,s2[u2][u1]=1; 
        if(m==1&&s1[k]==0) q1++,s1[k]=1;
    }
    memset(s,0,sizeof(s)); m=0;
    for(int i=1;i<=T;i++)
    {
        k=int(p[i][i])-64;
        if(s[k]==0)
        {
            s[k]=1;
            m=m+1;
            if(m==1) u1=k;
            if(m==2) u2=k;
        }
    }
    if(m==2&&s2[u1][u2]==0&&s2[u2][u1]==0) q2++,s2[u1][u2]=1,s2[u2][u1]=1; 
    if(m==1&&s1[k]==0) q1++,s1[k]=1;
    memset(s,0,sizeof(s));
	m=0;
    for(int i=1;i<=T;i++)
    {
        k=int(p[i][n-i+1])-64;
        if(s[k]==0)
        {
            s[k]=1;
            m=m+1;
            if(m==1) u1=k;
            if(m==2) u2=k;
        }
    }
    if(m==2&&s2[u1][u2]==0&&s2[u2][u1]==0) q2++,s2[u1][u2]=1,s2[u2][u1]=1; 
    if(m==1&&s1[k]==0) q1++,s1[k]=1;
    cout<<q1<<endl<<q2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值