EternalLBZ 2024-05-26 11:05 采纳率: 7.7%
浏览 0

哪里错了呀666666


#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <climits>
 
using namespace std;
 
const int MAXN = 100; // 假设n不会超过100
int grid[MAXN][MAXN];
int visited[MAXN][MAXN][2]; // visited[x][y][0]表示是否访问过(x,y),visited[x][y][1]表示到达(x,y)的最小花费
 
// 检查坐标是否有效
bool isValid(int x, int y, int n) {
    return x >= 0 && x < n && y >= 0 && y < n;
}
 
// 广度优先搜索
int bfs(int n, int r1, int c1, int r2, int c2) {
    queue<pair<int, int>> q;
    q.push({r1, c1});
    visited[r1][c1][0] = true;
    visited[r1][c1][1] = 0;
 
    while (!q.empty()) {
        auto front = q.front();
        q.pop();
        int x = front.first, y = front.second;
 
        // 检查是否到达目的地
        if (x == r2 && y == c2) {
            return visited[x][y][1];
        }
 
        // 探索四个方向
        for (int i = 0; i < 4; ++i) {
            int dx = (i == 0) ? -1 : (i == 1) ? 1 : 0;
            int dy = (i == 2) ? -1 : (i == 3) ? 1 : 0;
            int nx = x + dx, ny = y + dy;
 
            if (isValid(nx, ny, n) && !visited[nx][ny][0] && grid[nx][ny] == 0) {
                q.push({nx, ny});
                visited[nx][ny][0] = true;
                visited[nx][ny][1] = visited[x][y][1] + 1; // 计算花费
            }
        }
 
        // 考虑搭建桥的情况
        if (grid[x][y] == 1) {
            for (int i = 0; i < 4; ++i) {
                int dx = (i == 0) ? -1 : (i == 1) ? 1 : 0;
                int dy = (i == 2) ? -1 : (i == 3) ? 1 : 0;
                int nx = x + dx, ny = y + dy;
 
                if (isValid(nx, ny, n) && !visited[nx][ny][0] && grid[nx][ny] == 0) {
                    q.push({nx, ny});
                    visited[nx][ny][0] = true;
                    int cost = (x - nx) * (x - nx) + (y - ny) * (y - ny);
                    visited[nx][ny][1] = visited[x][y][1] + cost; // 计算搭建桥的花费
                }
            }
        }
    }
 
    return INT_MAX; // 如果无法到达目的地
}
 
int main() {
    int n, r1, c1, r2, c2;
    // 读取输入...
 
    // 初始化grid和visited数组
    memset(grid, 0, sizeof(grid));
    memset(visited, 0, sizeof(visited));
 
    int result = bfs(n, r1, c1, r2, c2);
    if (result == INT_MAX) {
        cout << "无法到达目的地" << endl;
    } else {
        cout << "最小花费为: " << result << endl;
    }
 
    return 0;
}

Alice想要站在一个
nn的矩形中,每个格子由0或1组成,0表示陆地,1表示河流。已知Alice站在点
(r1,c1)上,现在他想要到点
(r2,c2)上去。他可以从他所在的位置每次选择一个方向走一格,一共有4种方向(分别是上下左右)。显然在Alice走的过程中,很可能发现要到达目的地,必须要跨过河流,而Alice并不会游泳。幸运的是,他可以搭一座桥(他最多只能搭一座桥)帮助他跨过河流。桥的起点和终点只能够搭在陆地上,假设起点和终点分别为
(x1,y1)和
(x2,y2),他需要花
(x1-x2)
(x1-x2)+(y1-y2)*(y1-y2)。
现在请问最少花费多少?当不需要搭桥的时候,花费为0。

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-26 11:06
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在您提供的代码中,我注意到了几个潜在的问题,这些问题可能会导致程序无法正确运行或得到预期的结果。以下是一些可能的问题和建议的解决方案:

    1. 未初始化的变量: 在main函数中,n, r1, c1, r2, c2这些变量在使用之前没有被初始化。这可能导致未定义的行为,因为它们被用作数组的大小和索引。

      int n, r1, c1, r2, c2;
      // 你需要在这里初始化这些变量,例如从标准输入读取它们
      cin >> n >> r1 >> c1 >> r2 >> c2;
      
    2. 数组越界: 在isValid函数中,如果xyn-1,那么x+dxy+dy可能会超出数组的边界。你需要确保在isValid函数中检查x+dxy+dy是否仍然在数组的范围内。

      bool isValid(int x, int y, int n) {
          return x >= 0 && x < n && y >= 0 && y < n && x+dx >= 0 && x+dx < n && y+dy >= 0 && y+dy < n;
      }
      
    3. 桥的搭建逻辑: 在bfs函数中,桥的搭建逻辑似乎有问题。你不能在同一个位置重复搭建桥,而且桥的起点和终点必须是陆地。此外,桥的搭建成本应该是两点之间的距离平方和,而不是简单地加1。

      // 考虑搭建桥的情况
      if (grid[x][y] == 1 && visited[x][y][1] != INT_MAX) { // 确保当前位置是河流且没有被标记为INT_MAX
          for (int i = 0; i < 4; ++i) {
              // ... 省略其他代码 ...
              int nx = x + dx, ny = y + dy;
              if (isValid(nx, ny, n) && !visited[nx][ny][0] && grid[nx][ny] == 0) {
                  int cost = (x - nx) * (x - nx) + (y - ny) * (y - ny);
                  if (visited[nx][ny][1] == INT_MAX || visited[nx][ny][1] > visited[x][y][1] + cost) {
                      visited[nx][ny][1] = visited[x][y][1] + cost;
                      q.push({nx, ny});
                  }
              }
          }
      }
      
    4. 未定义的行为: 在main函数中,result变量在调用bfs之前没有初始化,这可能导致未定义的行为。

      int result = bfs(n, r1, c1, r2, c2);
      
    5. 内存分配: 使用memset来初始化gridvisited数组可能不是最佳实践,特别是对于大型数组。考虑使用循环来初始化它们。

      for (int i = 0; i < n; ++i) {
          for (int j = 0; j < n; ++j) {
              grid[i][j] = 0; // 或者根据输入初始化
              visited[i][j][0] = false;
              visited[i][j][1] = INT_MAX;
          }
      }
      
    6. 输入处理: 你需要确保输入处理逻辑正确,并且能够正确地读取grid数组。

    7. 输出格式: 确保输出格式符合题目要求,例如,如果无法到达目的地,输出应该是"无法到达目的地",如果能够到达,输出应该是"最小花费为: X"。

    请注意,这些只是基于您提供的代码片段的一些建议。在实际编程中,还需要考虑其他因素,如输入验证、异常处理等。希望这些建议能帮助您解决问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月26日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵