Comfortable Cows问题:代码实现、解释与复杂度分析
```cpp #include <iostream> #include <vector> #include <set> using namespace std; // 检查一个点是否有奶牛 bool hasCow(int x, int y, set<pair<int, int>>& cows) { return cows.find({x, y}) != cows.end(); } // 检查一头奶牛是否舒适 bool isComfortable(int x, int y, set<pair<int, int>>& cows) { int count = 0; if (hasCow(x - 1, y, cows)) count++; if (hasCow(x + 1, y, cows)) count++; if (hasCow(x, y - 1, cows)) count++; if (hasCow(x, y + 1, cows)) count++; return count == 3; } // 检查一个点周围是否有舒适的奶牛 bool hasComfortableAround(int x, int y, set<pair<int, int>>& cows) { if (hasCow(x, y, cows) && isComfortable(x, y, cows)) return true; if (hasCow(x - 1, y, cows) && isComfortable(x - 1, y, cows)) return true; if (hasCow(x + 1, y, cows) && isComfortable(x + 1, y, cows)) return true; if (hasCow(x, y - 1, cows) && isComfortable(x, y - 1, cows)) return true; if (hasCow(x, y + 1, cows) && isComfortable(x, y + 1, cows)) return true; return false; } int main() { int N; cin >> N; set<pair<int, int>> cows; int total = 0; for (int i = 0; i < N; i++) { int x, y; cin >> x >> y; cows.insert({x, y}); // 如果新加入奶牛后周围出现舒适的奶牛 if (hasComfortableAround(x, y, cows)) { // 找到需要添加的位置 vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; for (auto& dir : directions) { int newX = x + dir.first; int newY = y + dir.second; if (!hasCow(newX, newY, cows) && hasComfortableAround(newX, newY, cows)) { total++; cows.insert({newX, newY}); } } } cout << total << endl; } return 0; } ``` 代码解释 1. 数据结构:使用 `set<pair<int, int>> cows` 存储奶牛的坐标,借助 `set` 的特性可以高效地判断某坐标是否有奶牛。 2. 辅助函数: - `hasCow` 函数用于检查给定坐标处是否有奶牛。 - `isComfortable` 函数用于判断一头奶牛是否舒适,即其水平或竖直方向上与恰好三头其他奶牛相邻。 - `hasComfortableAround` 函数用于检查某个点周围是否有舒适的奶牛。 3. 主逻辑: - 循环 `N` 次,每次读取一头新奶牛的坐标并插入 `cows` 集合。 - 检查新加入奶牛后其周围是否有舒适的奶牛,若有则找到需要添加奶牛的位置,将其加入 `cows` 集合并更新 `total`。 - 输出当前需要添加的奶牛总数。 复杂度分析 - 时间复杂度:每次插入新奶牛后检查和添加新奶牛的操作时间复杂度为 $O(1)$,总共插入 $N$ 头奶牛,因此总的时间复杂度为 $O(N)$。 - 空间复杂度:使用了 `set` 存储奶牛坐标,最多存储 $N$ 头奶牛,因此空间复杂度为 $O(N)$。 ######[AI问答 | 956点数解答 | 2026-02-02 17:26:13]
- Comfortable Cows问题:代码实现、解释与复杂度分析(字节豆包 | 956点数解答 | 2026-02-02 17:26:13)55
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- C++求解序列或与运算和差值:避O(nq)复杂度及数据处理要点(字节豆包 | 534点数解答 | 2025-10-17 20:05:07)60
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)264
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)261
- 求解 1 至 n 内第 k 大孤独数:质数与余数的巧妙探寻(字节豆包 | 298点数解答 | 2025-11-10 20:01:57)153
- 巧判小朋友同桌意愿:满足需求还是无解难题?(字节豆包 | 599点数解答 | 2025-11-16 20:06:12)67
- 巧用代码判断:能否让 2n 个小朋友都拥有满意同桌?(字节豆包 | 445点数解答 | 2025-11-16 20:07:02)78
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)457
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)354
- Java 实现:轻松生成 5 位数字、大小写字母混合验证码( | 266点数解答 | 2024-03-06 17:39:10)329