【发布时间】: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 我知道这是应该使用的技术。我正在使用记忆,只是由于某种原因它不适用于非常大的网格。
-
是的,抱歉,在代码中漏掉了