USACO 2022 January Contest, Bronze ——Problem 1. Herdle

题目描述

奶牛们发明了一种名为 Herdle 的新型解谜游戏,在牛界引起了轰动。

每天都会有一个新谜题发布供奶牛解决。游戏采用 3x3 方阵的形式表示农场的一块田地,田地的每个方格都由特定品种的奶牛占据。总共只有 26 种可能的品种,每一种由 A 到 Z 中的不同大写字母标识。玩家不会被告知田地中的奶牛品种排列方式——游戏目标是通过一系列猜测确定它们。

每次猜测,奶牛们输入一个 3x3 的大写字母方阵,表示该田地可以用奶牛填充的可能方式。猜测的某些方格可能是正确的。这些方格以绿色高亮显示,让奶牛们知道这些是正确的。猜测的另一些方格可能填入了品种正确但位置错误的奶牛。这些以黄色高亮显示。

黄色高亮显示的方格的数量可以帮助指示某个品种的奶牛数量。 例如,假设猜测方阵包含 4 头品种 A 的奶牛,而答案方阵包含 2 只品种 A 的奶牛,其中没有正确位置上的 A (即,它们都不应该是绿色的)。 在这种情况下,猜测方阵中只有两个 A 应以黄色高亮显示。 更准确地说,如果猜测方阵中有 x 个特定品种的奶牛,并且 答案方阵中有 y<x 头该品种奶牛(不包括位置正确而得到绿色高亮显示的奶牛),那么猜测方阵的 x 头奶牛中只有 y 头奶牛应该以黄色高亮显示。

给定正确答案的方阵和一个表示对该答案的猜测的方阵,请计算绿色和黄色高亮显示的方格的数量。

输入格式(从终端 / 标准输入读入):

输入的前 3 行给定了正确答案的方阵。以下 3 行表示对该答案的猜测。

输出格式(输出至终端 / 标准输出):

输出两行。输出的第一行包含应当以绿色高亮显示的方格的数量。输出的第二行包含应当以黄色高亮显示的方格的数量。

【输入输出样例】

输入样例1:

COW
SAY
MOO
WIN
THE
IOI

输出样例1:

1
1

在这个例子中,最后一行中间的 O 是正确的,所以这个方格以绿色高亮显示。字母 W 位于错误的位置,所以它以黄色高亮显示。

输入样例2:

AAA
BBB
CCC
AYY
AAA
ZZZ

输出样例2:

1
2

在这里,其中一个 A 位于正确的位置,所以它以绿色高亮显示。余下的 A 均不在正确位置上,由于答案方阵中有两个 A,所以有两个 A 应当以黄色高亮显示。

供题:Brian Dean,灵感来自应用 "Wordle"


第一版代码(部分数据点正确,有骗分的成分在)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
char answer[100][100],check[100][100];

int main()
{
	long long int i,j,k,m,len1,len2,green=0,yellow=0;
	string n;
	for(i=0;i<3;++i)
	{
		cin>>n;
		len1=n.length();
		for(j=0;j<len1;++j)
		{
			answer[i][j]=n[j];
		}
	}
	
	for(i=0;i<3;++i)
	{
		cin>>n;
		len2=n.length();
		for(j=0;j<len2;++j)
		{
			check[i][j]=n[j];
		}
	}
		
		for(i=0;i<3;++i)
		{
			for(j=0;j<3;++j)
			{
				if(answer[i][j]==check[i][j])	
				{
				green++;
				}
			}
		}
		
	for(i=0;i<3;++i)
		{
			for(j=0;j<3;++j)
			{
				if(answer[i][j]==check[i][j])	
				{
				yellow++;
				}	
			}
	}                    //黄色的高亮部分不知道怎么判断,就直接复制了绿色部分骗了三个数据点

	cout<<green<<endl;
	cout<<yellow<<endl;
	
	return 0;
}

测试结果:(相比上一次啥也没对,是有一点点进步了的) 


已AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
char answer[10][10],check[10][10];
int sum1[27],sum2[27];
int main()
{
	int i,j,green=0,yellow=0;
	string n;
	for(int i=0;i<3;++i)
	{
		for(int j=0;j<3;++j)
		{
			cin>>answer[i][j];
		}
	}
	
	for(int i=0;i<3;++i)
	{
		for(int j=0;j<3;++j)
		{
			cin>>check[i][j];
		}
	}
		
		for(i=0;i<3;++i)
		{
			for(j=0;j<3;++j)
			{
				if(answer[i][j]==check[i][j])	 //统计绿色
				{
				green++;
				}
				else  //统计在方块中存在,但位置不对的情况
				{
					sum1[answer[i][j]-'A']++; //统计上部分的方块各个字母的数量
					sum2[check[i][j]-'A']++; //统计下部分的方块各个字母的数量
				}
			}
		}
		for(int i=0;i<26;++i)
		{
			yellow+=min(sum1[i],sum2[i]);
         //以较小的数量为准,因为多了的字母上/下面不一定有,少了的一定会满足
		}
	cout<<green<<endl;
	cout<<yellow<<endl;
	
	return 0;
}
	

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值