列表

详情


NC24283. [USACO 2018 Ope B]Team Tic Tac Toe

描述

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

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

以下是一个棋盘的例子:

COW XXO ABC 

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

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

输入描述

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

输出描述

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

示例1

输入:

COW
XXO
ABC

输出:

0
2

说明:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 32ms, 内存消耗: 3524K, 提交时间: 2019-06-29 20:27:28

arr=[input() for i in range(3)]
dict01={}
dict02={}
for i in range(3) :
    tmp_dict1={}
    tmp_dict1[arr[i][0]]=1
    tmp_dict1[arr[i][1]]=1
    tmp_dict1[arr[i][2]]=1
    if len(tmp_dict1)==1 :
        dict01[arr[i][0]]=1
    elif len(tmp_dict1)==2 :
        dict02[str(sorted(list(tmp_dict1)))]=1

    tmp_dict2={}
    tmp_dict2[arr[0][i]]=1
    tmp_dict2[arr[1][i]]=1
    tmp_dict2[arr[2][i]]=1
    if len(tmp_dict2)==1 :
        dict01[arr[0][i]]=1
    elif len(tmp_dict2)==2 :
        dict02[str(sorted(list(tmp_dict2)))]=1

tmp_dict={}
tmp_dict[arr[0][0]]=1
tmp_dict[arr[1][1]]=1
tmp_dict[arr[2][2]]=1
if len(tmp_dict)==1 :
    dict01[arr[0][0]]=1
elif len(tmp_dict)==2 :
    dict02[str(sorted(list(tmp_dict)))]=1
tmp_dict={}
tmp_dict[arr[0][2]]=1
tmp_dict[arr[1][1]]=1
tmp_dict[arr[2][0]]=1
if len(tmp_dict)==1 :
    dict01[arr[0][0]]=1
elif len(tmp_dict)==2 :
    dict02[str(sorted(list(tmp_dict)))]=1

# print(dict01)
# print(dict02)
print(len(dict01))
print(len(dict02))

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 480K, 提交时间: 2019-06-29 20:19:16

#include<bits/stdc++.h>
typedef long long LL;

char ipt[10];

int ans[5];
int s[130],t[130][130];

void cnt(int x,int y,int z){
    int res=3;
    if(ipt[x]==ipt[y]&&ipt[z]==ipt[y]){
        int k=ipt[x]-'A';
        if(!s[k])s[k]=1,ans[1]++;
        return;
    }
    int k1,k2,flag=false;
    if(ipt[x]==ipt[y])
        k1=ipt[x]-'A',k2=ipt[z]-'A',flag=true;
    
    if(ipt[x]==ipt[z])
        k1=ipt[x]-'A',k2=ipt[y]-'A',flag=true;
    
    if(ipt[z]==ipt[y])
        k1=ipt[x]-'A',k2=ipt[z]-'A',flag=true;
    
    if(flag&&!t[k1][k2])t[k1][k2]=t[k2][k1]=1,ans[2]++;
    
    
}

int main(){
    scanf("%s%s%s",ipt,ipt+3,ipt+6);
    cnt(0,1,2);
    cnt(3,4,5);
    cnt(6,7,8);
    cnt(0,3,6);
    cnt(1,4,7);
    cnt(2,5,8);
    cnt(0,4,8);
    cnt(2,4,6);
    printf("%d\n%d\n",ans[1],ans[2]);



}

C++ 解法, 执行用时: 3ms, 内存消耗: 440K, 提交时间: 2022-05-12 17:02:09

// USACO 2018 Open B. Team Tic Tac Toe
#include <bits/stdc++.h>
using namespace std;
#define _for(i, a, b) for (int i = (a); i < (int)(b); ++i)
const int W = 3;
using IP = pair<int, int>;
vector<string> G(W);
set<set<char>> Win[W + 1];
void insert(const vector<IP>& ps) {
  set<char> S;
  for (const IP& p : ps) S.insert(G[p.first][p.second]);
  Win[S.size()].insert(S);
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  _for(r, 0, W) cin >> G[r];
  _for(i, 0, W) insert({{i, 0}, {i, 1}, {i, 2}});
  _for(i, 0, W) insert({{0, i}, {1, i}, {2, i}});
  insert({{0, 0}, {1, 1}, {2, 2}});
  insert({{2, 0}, {1, 1}, {0, 2}});
  cout << Win[1].size() << endl;
  cout << Win[2].size() << endl;
}

上一题