我有2个基于this challenge here的非常相似的程序。一个使用数组,一个使用向量。但他们的输出是不同的。即使算法是相同的。请解释一下?
这是代码。 数组版本(输出为2,这是不正确的):
#include <iostream>
#define SIZE 4
int step(int grid[][SIZE], int i, int j)
{
if (i < 0 || j < 0 || i > 3 || j > 3)
return 0;
if (grid[i][j] == 1)
return 0;
if ( i == 3 && j == 3)
return 1;
grid[i][j] = 1;
return step(grid, i - 1, j) + step(grid, i + 1, j) + step(grid, i, j - 1) + step(grid, i, j + 1);
}
int main()
{
int grid[][SIZE] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
std::cout<<step(grid, 0, 0)<<std::endl;
return 0;
}
矢量版本(输出184,正确):
#include <iostream>
#include <vector>
#define SIZE 4
int step(std::vector<std::vector<int> > grid, int i, int j)
{
if (i < 0 || j < 0 || i > 3 || j > 3)
return 0;
if (grid[i][j] == 1)
return 0;
if ( i == 3 && j == 3)
return 1;
grid[i][j] = 1;
return step(grid, i - 1, j) + step(grid, i + 1, j) + step(grid, i, j - 1) + step(grid, i, j + 1);
}
int main()
{
std::vector<std::vector<int> > grid;
std::vector<int> column1(4,0);
for (int i = 0; i < SIZE; ++i)
grid.push_back(column1);
std::cout<<step(grid, 0, 0)<<std::endl;
return 0;
}
答案 0 :(得分:0)
第一个版本通过引用传递数组 ,因为它等同于将指针传递给数组。第二个版本传递矢量按值,这意味着每个递归调用向量都是在堆栈上创建的,您更改仅本地副本。从函数返回时,此更改会立即消失。
您应该使用以下签名通过引用传递矢量:
int step(std::vector<std::vector<int> >& grid, int i, int j)