c++ 代码不提供输出(主题:递归和 2D 向量)
c++ code not giving output (topic : recursion and 2D vector)
- 给你一个数字 n,代表行数。
- 给你一个数字 m,代表列数。
- 给你 n*m 个数字,代表二维数组 a 的元素。数字只能是 1 或 0。
- 你站在左上角,必须到达右下角。
只允许四次移动 't'(向上 1 步),'l'(向左 1 步),'d'(向下 1 步)'r'(向右 1 步).您只能移动到其中具有 0 值的单元格。您不能移出边界或其中值为 1 的单元格(1 表示障碍)
- 完成 floodfill 函数的主体 - 不更改签名 - 以打印可用于从左上角移动到右下角的所有路径。
这就是问题,这里是link供参考https://www.pepcoding.com/resources/online-java-foundation/recursion-backtracking/flood-fill-official/ojquestion#
我使用了以下代码并检查了很多次我没有发现任何错误请帮我找出问题所在,我正在用 c++ 编码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void floodfill(vector<vector<int>> maze, int sr, int sc, string psf, vector<vector<int>> visited)
{
if (sr < 0 || sc < 0 || sr == maze.size() || sc == maze[0].size() ||
maze[sr][sc] == 1 || visited[sr][sc] == 1)
return;
if (sr == maze.size() - 1 && sc == maze[0].size() - 1)
{
cout << psf << endl;
return;
}
visited[sr][sc] == 1;
floodfill(maze, sr - 1, sc, psf + "t", visited);
floodfill(maze, sr, sc - 1, psf + "l", visited);
floodfill(maze, sr + 1, sc, psf + "d", visited);
floodfill(maze, sr, sc + 1, psf + "r", visited);
visited[sr][sc] == 0;
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m));
vector<vector<int>> visited(n, vector<int>(m));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
floodfill(arr, 0, 0, "", visited);
}
请有人帮助thnx..
您需要添加对向量的引用。 C 和 C++ 是按值传递的语言,您需要明确告诉 C++ 您正在按引用传递。
void floodfill(vector<vector<int>>& maze, int sr, int sc, string psf, vector<vector<int>>& visited)
{
if (sr < 0 || sc < 0 || sr == maze.size() || sc == maze[0].size() ||
maze[sr][sc] == 1 || visited[sr][sc] == 1)
return;
if (sr == maze.size() - 1 && sc == maze[0].size() - 1)
{
cout << psf << endl;
return;
}
visited[sr][sc] = 1;
floodfill(maze, sr - 1, sc, psf + "t", visited);
floodfill(maze, sr, sc - 1, psf + "l", visited);
floodfill(maze, sr + 1, sc, psf + "d", visited);
floodfill(maze, sr, sc + 1, psf + "r", visited);
visited[sr][sc] = 0;
}
另外我想你可能想在这里做作业visited[sr][sc] == 1;
- 给你一个数字 n,代表行数。
- 给你一个数字 m,代表列数。
- 给你 n*m 个数字,代表二维数组 a 的元素。数字只能是 1 或 0。
- 你站在左上角,必须到达右下角。 只允许四次移动 't'(向上 1 步),'l'(向左 1 步),'d'(向下 1 步)'r'(向右 1 步).您只能移动到其中具有 0 值的单元格。您不能移出边界或其中值为 1 的单元格(1 表示障碍)
- 完成 floodfill 函数的主体 - 不更改签名 - 以打印可用于从左上角移动到右下角的所有路径。
这就是问题,这里是link供参考https://www.pepcoding.com/resources/online-java-foundation/recursion-backtracking/flood-fill-official/ojquestion#
我使用了以下代码并检查了很多次我没有发现任何错误请帮我找出问题所在,我正在用 c++ 编码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void floodfill(vector<vector<int>> maze, int sr, int sc, string psf, vector<vector<int>> visited)
{
if (sr < 0 || sc < 0 || sr == maze.size() || sc == maze[0].size() ||
maze[sr][sc] == 1 || visited[sr][sc] == 1)
return;
if (sr == maze.size() - 1 && sc == maze[0].size() - 1)
{
cout << psf << endl;
return;
}
visited[sr][sc] == 1;
floodfill(maze, sr - 1, sc, psf + "t", visited);
floodfill(maze, sr, sc - 1, psf + "l", visited);
floodfill(maze, sr + 1, sc, psf + "d", visited);
floodfill(maze, sr, sc + 1, psf + "r", visited);
visited[sr][sc] == 0;
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m));
vector<vector<int>> visited(n, vector<int>(m));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
floodfill(arr, 0, 0, "", visited);
}
请有人帮助thnx..
您需要添加对向量的引用。 C 和 C++ 是按值传递的语言,您需要明确告诉 C++ 您正在按引用传递。
void floodfill(vector<vector<int>>& maze, int sr, int sc, string psf, vector<vector<int>>& visited)
{
if (sr < 0 || sc < 0 || sr == maze.size() || sc == maze[0].size() ||
maze[sr][sc] == 1 || visited[sr][sc] == 1)
return;
if (sr == maze.size() - 1 && sc == maze[0].size() - 1)
{
cout << psf << endl;
return;
}
visited[sr][sc] = 1;
floodfill(maze, sr - 1, sc, psf + "t", visited);
floodfill(maze, sr, sc - 1, psf + "l", visited);
floodfill(maze, sr + 1, sc, psf + "d", visited);
floodfill(maze, sr, sc + 1, psf + "r", visited);
visited[sr][sc] = 0;
}
另外我想你可能想在这里做作业visited[sr][sc] == 1;