C++模拟:梁总追捕森林双牛,避免无限循环寻相遇时刻!
```cpp #include <iostream> #include <vector> using namespace std; // 定义方向,0: 北,1: 东,2: 南,3: 西 const int dx[4] = {-1, 0, 1, 0}; const int dy[4] = {0, 1, 0, -1}; // 检查位置是否合法 bool isValid(int x, int y, vector<string>& grid) { return x >= 0 && x < 10 && y >= 0 && y < 10 && grid[x][y] != '*'; } // 模拟移动 void move(int& x, int& y, int& dir, vector<string>& grid) { int nx = x + dx[dir]; int ny = y + dy[dir]; if (isValid(nx, ny, grid)) { x = nx; y = ny; } else { // 无法前进,顺时针转90度 dir = (dir + 1) % 4; } } int main() { vector<string> grid(10); // 读取地图 for (int i = 0; i < 10; i++) { cin >> grid[i]; } int fx, fy, cx, cy; // 找到梁总和牛的初始位置 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (grid[i][j] == 'F') { fx = i; fy = j; } else if (grid[i][j] == 'C') { cx = i; cy = j; } } } int fdir = 0, cdir = 0; // 初始方向都为正北 int minutes = 0; // 记录状态,避免无限循环 bool visited[10][10][10][10][4][4] = {false}; while (true) { // 检查是否已经访问过该状态 if (visited[fx][fy][cx][cy][fdir][cdir]) { cout << 0 << endl; return 0; } visited[fx][fy][cx][cy][fdir][cdir] = true; // 移动梁总和牛 move(fx, fy, fdir, grid); move(cx, cy, cdir, grid); minutes++; // 检查是否相遇 if (fx == cx && fy == cy) { cout << minutes << endl; return 0; } } return 0; } ``` 注释解释: 1. `dx` 和 `dy` 数组:用于表示四个方向(北、东、南、西)的偏移量。 2. `isValid` 函数:检查给定的位置是否合法,即是否在地图范围内且不是障碍物。 3. `move` 函数:模拟梁总和牛的移动。如果前方无障碍,则前进;否则顺时针转90度。 4. `main` 函数: - 读取地图并找到梁总和牛的初始位置。 - 初始化方向为正北。 - 使用 `visited` 数组记录已经访问过的状态,避免无限循环。 - 在循环中不断移动梁总和牛,并检查是否相遇或进入已访问状态。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 边界检查:在判断位置是否合法时,要确保不越界,同时要考虑地图边沿也是障碍。 2. 状态记录:使用 `visited` 数组记录已经访问过的状态,避免程序陷入无限循环。 3. 移动顺序:梁总和牛的移动是同时进行的,要确保在同一分钟内完成移动。 ######[AI写代码神器 | 916点数解答 | 2025-11-21 18:19:54]
- C++编程:10×10方格中猫鼠相遇时间大揭秘!(GPT | 505点数解答 | 2025-01-12 20:11:03)238
- 洛谷乒乓球题解:11 分制与 21 分制比赛结果计算全攻略(DeepSeek | 675点数解答 | 2025-04-28 18:19:45)305
- C++ 模拟:助冒险者用神秘数字构建直角三角形,开发要点大揭秘! (DeepSeek | 156点数解答 | 2025-09-14 21:30:10)285
- P1007:小核桃数组变换难题,Python代码揭秘最终平方和!(字节豆包 | 416点数解答 | 2026-02-07 18:24:18)46
- P1007小核桃数组变换难题:C++代码求解最终两数平方和! (字节豆包 | 651点数解答 | 2026-02-07 18:25:02)36
- “天气之子”试炼:用代码破解天气预报成功天数之谜,复杂度分析揭秘!(字节豆包 | 797点数解答 | 2026-02-07 18:29:12)42
- 揭秘天气之子试炼:巧用算法计算天气预报成功天数(字节豆包 | 734点数解答 | 2026-02-07 18:30:34)32
- C++实现:根据给定参数打印栅栏图案(P1015禾木与栅栏)(字节豆包 | 160点数解答 | 2026-02-07 18:36:06)42
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)467
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)359
- C语言:巧用循环精确逼近e值,输出结果与项数!(字节豆包 | 223点数解答 | 2024-10-16 14:36:48)303
- 三菱PLC梯形图编程:手动自动模式全掌控,含急停计数与故障报警!(字节豆包 | 328点数解答 | 2024-11-02 21:09:00)522