【问题标题】:My implementation of the grid traveller problem only works for small grids我的网格旅行者问题的实现只适用于小网格
【发布时间】:2021-07-26 14:56:38
【问题描述】:

我在 38:39 尝试这个问题进入这个免费的代码营视频:https://youtu.be/oBt53YbR9Kk?t=2361

问题如下:

假设您是 2D 网格上的旅行者。你从顶部开始 左下角,你的目标是到达右下角。 您只能向下或向右移动。

你可以通过多少种方式到达网格上的目标 尺寸 m*n

编写一个计算这个的函数 GridTraveller(m,n)。

我的尝试给出了除 18 x 18 网格之外的所有内容的正确答案,这是我的代码:

#include <iostream>
#include <map>


struct grid {
  unsigned long long int x,y;
  grid(unsigned long long int x_c, unsigned long long  int y_c):x(x_c),y(y_c){};

 bool operator< (const grid& rhs) const {
    return (x + y < rhs.x+rhs.y);

}
};



unsigned long long int grd_traveller(grid grd, std::map <grid,unsigned long long int> &mem){
  if (mem.count(grd) != 0){
    return mem[grd];
  }
  else if (grd.x ==1 || grd.y ==1){
    return 1;
  }

  else if (grd.x==0 || grd.y ==0){
    return 0;
  }
  else {
    grid iter1(grd.x-1,grd.y);
    grid iter2(grd.x,grd.y-1);

    unsigned long long int answer =  grd_traveller(iter1,mem) + grd_traveller(iter2,mem);
    mem[grd] = answer;
    return answer;
  }
}



int main(){
  std::map <grid,unsigned long long int> memory;
  std::cout << std::to_string(grd_traveller(grid(1,1),memory))<<"\n"; // Should give 1 and does
  std::cout << std::to_string(grd_traveller(grid(2,3),memory))<<"\n"; // Should give 3 and does
  std::cout << std::to_string(grd_traveller(grid(3,2),memory))<<"\n"; // Should give 3 and does
  std::cout << std::to_string(grd_traveller(grid(3,3),memory))<<"\n"; // Should give 6 and does
  std::map <grid,unsigned long long int> memory2;
  std::cout << grd_traveller(grid(18,18),memory2)<<"\n"; // Should give 2333606220, but doesn't 

}

起初我认为这可能是内存问题,所以我将所有内容都增加到 unsigned long long int 但这并没有解决它。更奇怪的是,对于 18 x 18 网格,如果我使用第一张地图 memory 或第二张地图 memory2,我会得到不同的答案。这很奇怪,我不知道是什么导致了这种行为。有人有什么想法吗?

【问题讨论】:

  • @Jeffrey 我知道这是应该使用的技术。我正在使用记忆,只是由于某种原因它不适用于非常大的网格。
  • 是的,抱歉,在代码中漏掉了

标签: c++ dynamic-programming


【解决方案1】:

问题在于您的比较运算符重载:

x + y < rhs.x+rhs.y

这个检查是不够的,因为它只是比较坐标的总和。您应该编写一个按特定顺序检查坐标的代码:

x < rhs.x || x == rhs.x && y < rhs.y

否则,例如,坐标为 (1, 5) 和 (2, 4) 的网格被 std::map 容器视为相等,因为 1 + 5 == 2 + 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多