奶牛交叉(C++)

该博客讨论了一道关于奶牛穿越马路问题的编程题,要求计算不同奶牛交叉路径的对数。给定一个字符串表示奶牛的路径,通过两重循环搜索满足条件的交叉对并输出总数。程序使用C++编写,通过记录每个字母首次和再次出现的位置来确定交叉对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
    男神Sharpland农场的布局相当奇特,他的牛白天吃草的田野周围,绕着一条大型圆形道路。
    每天早晨,牛在前往田野时要穿过这条路,每天晚上,他们离开田野回到谷仓时,都会再过一遍这条路。
    正如我们所知,牛是一种习惯性动物,它们每天都以同样的方式过马路。每头牛都在不同的点进入田野,走出田野,并且所有的点都与其他的不同。Sharpland拥有26头牛,他把他们命名为A到Z,所以在这条路上有52个点。Sharpland通过绕着圆形道路顺时针方向扫描这些点来记录它们,写下每一个点所属的牛的名字,最终形成一个有52个字符的字符串,字母表中的每一个字母都出现了两次。
    他没有记录哪些点是进入田野的点,哪些是走出田野的点。
    看着他的地图,Sharpland很好奇,在一天中会有多少对不同的奶牛穿过马路。如果牛A从入口到出口的路径必须穿过牛B从入口到出口的路径,他把这对奶牛(A,B)称为交叉对。请帮助Sharpland计算出交叉对的数量。
输入格式
    输入由一行包含52个大写字母的字符串组成。其中每个大写字母都出现了两次。
输出格式
    请输出交叉对的总数。
样例数据
input
ABCCABDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ
output
1
思路
    读入,判断,没出现过的记坐标a,出现过的几坐标b,然后就两重循环搜,满足条件的累加嘛。
程序如下
#include<bits/stdc++.h>
using namespace std;
int a['Z'+1]={0},b['Z'+1]={0};
int main()
{
char ch;
int s=0;
for(int i=1;i<=52;i++)
{
ch=getchar();
if(a[ch]==0) a[ch]=i;
else b[ch]=i;
}
for(int i='A';i<='Z';i++)
for(int j=i+1;j<='Z';j++)
if(((a[i]<a[j] && a[j]<b[i]) && (a[j]<b[i] && b[i]<b[j])) || ((a[j]<a[i] && a[i]<b[j]) && (a[i]<b[j] && b[j]<b[i]))) s++;
cout<<s<<endl;
return 0;
}
### 关于 C++ 中与奶牛相关的项目或示例代码 在面向对象编程 (OOP) 的上下文中,可以通过定义类来模拟现实世界中的实体及其行为。例如,在描述奶牛时,可以将其视为一种动物,并利用继承和多态的概念构建层次结构。 #### 示例:基于 OOP 的奶牛类设计 以下是一个简单的 C++ 程序,展示了如何使用继承和多态来创建一个 `Cow` 类,该类从基类 `Animal` 继承而来: ```cpp #include <iostream> #include <string> // 基类 Animal class Animal { public: virtual void speak() const = 0; // 纯虚函数,用于实现多态 }; // 子类 Cow,继承自 Animal class Cow : public Animal { private: std::string name; public: explicit Cow(const std::string& cowName) : name(cowName) {} void speak() const override { // 实现父类的纯虚函数 std::cout << name << " says: Moo!" << std::endl; } }; int main() { Cow dairyCow("Daisy"); dairyCow.speak(); // 输出 Daisy says: Moo! return 0; } ``` 上述代码中,`Cow` 是 `Animal` 的子类[^3],并实现了其抽象方法 `speak()`。这体现了继承和多态的核心思想。 --- #### 结合实际场景的应用案例 如果希望进一步扩展此程序,使其更贴近实际应用,可以考虑以下几个方向: 1. **农场管理系统** 创建多个动物类(如 `Sheep`, `Chicken`),并将它们统一管理在一个农场容器中。 2. **奶产量统计** 添加成员变量记录每头奶牛的日均产奶量,并提供相应的 getter 和 setter 方法。 以下是改进后的版本,增加了日均产奶量的功能: ```cpp #include <iostream> #include <vector> #include <memory> // 使用智能指针管理动态内存 class Animal { public: virtual ~Animal() = default; // 虚析构函数确保派生类资源释放 virtual void speak() const = 0; }; class Cow : public Animal { private: std::string name; double milkProductionPerDay; public: Cow(const std::string& cowName, double production) : name(cowName), milkProductionPerDay(production) {} void speak() const override { std::cout << name << " says: Moo!" << std::endl; } double getMilkProduction() const { return milkProductionPerDay; } }; void manageFarm(std::vector<std::unique_ptr<Animal>>& animals) { for (const auto& animal : animals) { animal->speak(); if (auto* cow = dynamic_cast<Cow*>(animal.get())) { std::cout << "Daily Milk Production of " << cow->getName() << ": " << cow->getMilkProduction() << " liters." << std::endl; } } } int main() { std::vector<std::unique_ptr<Animal>> farm; farm.emplace_back(std::make_unique<Cow>("Bessie", 8.5)); farm.emplace_back(std::make_unique<Cow>("Buttercup", 7.2)); manageFarm(farm); return 0; } ``` 在此示例中,引入了智能指针 (`std::unique_ptr`) 来简化动态内存管理[^1],并通过 `dynamic_cast` 检查具体类型的实例。 --- #### 字谜游戏中的奶牛主题 根据引用的内容[^4],还可以开发一款以奶牛为主题的字谜游戏。该游戏的目标是让用户猜测与奶牛相关的单词,例如 “moo”, “cow”, 或者 “dairy”。以下是基本框架: ```cpp #include <iostream> #include <algorithm> #include <set> #include <string> bool isAnagramOrUniqueChars(const std::string& guess, const std::string& word) { if (guess.length() != word.length()) return false; // 判断是否为变位词 std::string sortedGuess = guess; std::string sortedWord = word; std::sort(sortedGuess.begin(), sortedGuess.end()); std::sort(sortedWord.begin(), sortedWord.end()); if (sortedGuess == sortedWord) return true; // 判断是否有重复字符 std::set<char> uniqueGuess(guess.begin(), guess.end()); std::set<char> uniqueWord(word.begin(), word.end()); return uniqueGuess == uniqueWord; } int main() { std::string mysteryWord = "moo"; std::string playerGuess; std::cout << "Welcome to the Cow-themed Word Guessing Game!" << std::endl; std::cout << "Enter your guess:" << std::endl; std::cin >> playerGuess; if (isAnagramOrUniqueChars(playerGuess, mysteryWord)) { std::cout << "Correct! The word was '" << mysteryWord << "'." << std::endl; } else { std::cout << "Incorrect. Try again next time!" << std::endl; } return 0; } ``` 这个游戏逻辑结合了字符串处理技巧,允许玩家输入可能的解密结果,并验证其有效性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值