奶牛组队

Farmer John有26头奶牛,恰好她们名字都以不同的字母开头,所以Farmer John用每头奶牛的名字的首字母来指代她——个A…Z之间的字母。

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

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

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

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

输出格式:
输出包含两行。 第一行,输出能够获胜的单独的奶牛的数量。 第二行,输出能够获胜的两头奶牛组成的队伍的数量。

输入输出样例
输入样例#1:
COW
XXO
ABC
输出样例#1:
0
2
输入样例#2:
CXW
XXO
AXC
输出样例#2:
1
2
说明
【样例说明1】

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

【样例说明2】

在这个例子中,单独的个人X可以获得胜利(X占据了第二列);如果C和X组队,他们可以通过C-X-C对角线获胜;如果X和O组队,他们可以通过中间一行取胜。

#include<bits/stdc++.h>
using namespace std;
char yx[4][4],ch1,ch2,ch3,rep_3[10];
struct rep{char one, two;}rep_2[10];
bool comp(const rep &a, const rep &b)
{
    if(a.one!=b.one) return a.one<b.one;
    return a.two < b.two;
}
int l=0,k=0;
void pd(int a,int b,int c,int d,int e,int f){
    if(yx[a][b]==yx[c][d] || yx[a][b]==yx[e][f] || yx[c][d]==yx[e][f]){
            ch1 = yx[a][b];
            ch2 = yx[c][d];
            ch3 = yx[e][f];
            if(ch1!=ch2){
                l++; 
                rep_2[l].one=ch1;
                rep_2[l].two=ch2;
            }
            else if(ch1!=ch3){
                l++;
                rep_2[l].one=ch1;
                rep_2[l].two=ch3;
            }
            else if(ch2!=ch3){
                l++;
                rep_2[l].one=ch2;
                rep_2[l].two=ch3;
            }
            else rep_3[++k]=ch1;
            if(rep_2[l].one > rep_2[l].two) swap(rep_2[l].one, rep_2[l].two);
        }
}
int main(){
    for(int i=1; i<=3; i++)
        for(int j=1; j<=3; j++)
            cin >> yx[i][j];
    for(int i=1; i<=3; i++) pd(i,1, i,2, i,3);
    for(int i=1; i<=3; i++) pd(1,i, 2,i, 3,i);
    pd(1,1, 2,2, 3,3);
    pd(1,3, 2,2, 3,1);
    sort(rep_2+1, rep_2+l+1, comp);
    sort(rep_3+1, rep_3+k+1);
    int m=0;
    for(int i=1; i<=k; i++)
        if(rep_3[i]!=rep_3[i-1]) m++;
    int n=0;
    for(int i=1; i<=l; i++)
        if(rep_2[i].one!=rep_2[i-1].one || rep_2[i].two!=rep_2[i-1].two) n++;
    cout << m << endl << n << endl;
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值