我正在尝试使用个性化头文件创建递归子程序,以递归方式填充数组。该数组最初填充为0,并且最后填充所有1,至少在适当时填充。我进行了设置,以便每次调用子程序时,都会检查周围的所有点,包括对角线。但是,它并没有完全填满。我假设它可能是我将if语句放入的顺序,但我还没弄明白如何让它继续递归填充。
我知道它已停止了,因为在某些时候,它会检测到周围没有未填充的其他点,这是不正确的。我在问我创造了什么逻辑缺陷,因为到目前为止我还没有找到它。谢谢。
有关预定义方法的说明:setCoordinates()将指定的空间设置为所选值。 getCoordinates从vector<中的Grid类中检索坐标。矢量>形式。
编辑:我删除了else if语句的else部分,并且当前导坐标为0时,所有内容都被泛洪填充。我仍在调查此内容。
Edit2:显然是通过添加if语句:
if(i == 0)
{
i1 = i + 1;
vec.setCoordinates(i1, j, 1);
Fill_image(vec, i1, j);
}
如果0是领先系数,则在所有其他if语句之后使其起作用。我会在早上尝试填充特定图像时检查这会产生什么影响,但我现在想要的是一个简单的0矩阵填充。
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include "Grid.h"
using namespace std;
void Fill_image(Grid & vec, int i, int j);
int main()
{
int size_Column, size_Row, count1 = 0, count2 = 0, count3 = 0, count4 = 0, count5 =
0, x, y;
cout << "Enter the size you want the rows and columns to be: ";
cin >> size_Row >> size_Column;
vector< vector<int> > Image(size_Row);
vector<int> Rows(size_Column);
while(count3 < Image.size())
{
Image[count3] = Rows;
count3 += 1;
}
while(count1 < Image.size())
{
while(count2 < Rows.size())
{
Image[count1][count2] = 0;
cout << setw(3) << Image[count1][count2];
count2 += 1;
}
cout << endl;
count1 += 1;
count2 = 0;
}
cout << "Enter the coordinates you want to start out with: ";
cin >> x >> y;
Grid Board(Image);
Fill_image(Board, x, y);
while(count4 < Image.size())
{
while(count5 < Rows.size())
{
cout << setw(3) << Board.getCoordinates()[count4][count5];
count5 += 1;
}
cout << endl;
count4 += 1;
count5 = 0;
}
return 0;
}
void Fill_image(Grid & vec, int i, int j)
{
vector< vector<int> > board = vec.getCoordinates();
vector<int> Placeholder = board[0];
int j1 = j + 1;
int j2 = j - 1;
int i1 = i + 1;
int i2 = i - 1;
if(j1 > Placeholder.size() - 1)
{
j1 = j;
}
if(j2 < 0)
{
j2 = j;
}
if(i1 > board.size() - 1)
{
i1 = i;
}
if(i2 < 0)
{
i1 = i;
}
if(j < Placeholder.size() && j >= 0 && i < board.size() && i >= 0 && board[i][j] ==
0)
{
vec.setCoordinates(i, j, 1);
Fill_image(vec, i, j);
}
else if(j1 < Placeholder.size() && board[i][j1] == 0)
{
vec.setCoordinates(i, j1, 1);
Fill_image(vec, i, j1);
}
else if(j2 >= 0 && board[i][j2] == 0)
{
vec.setCoordinates(i, j2, 1);
Fill_image(vec, i, j2);
}
else if(i1 < board.size() && board[i1][j] == 0)
{
vec.setCoordinates(i1, j, 1);
Fill_image(vec, i1, j);
}
else if(i2 >= 0 && board[i2][j] == 0)
{
vec.setCoordinates(i2, j, 1);
Fill_image(vec, i2, j);
}
else if(i2 >= 0 && j2 >= 0 && board[i2][j2] == 0)
{
vec.setCoordinates(i2, j2, 1);
Fill_image(vec, i2, j2);
}
else if(i2 >= 0 && j1 < Placeholder.size() && board[i2][j1] == 0)
{
vec.setCoordinates(i2, j1, 1);
Fill_image(vec, i2, j1);
}
else if(j2 >= 0 && i1 < board.size() && board[i1][j2] == 0)
{
vec.setCoordinates(i1, j1, 1);
Fill_image(vec, i1, j2);
}
else if(i1 < board.size() && j1 < Placeholder.size() && board[i1][j1] == 0)
{
vec.setCoordinates(i1, j1, 1);
Fill_image(vec, i1, j1);
}
}
答案 0 :(得分:2)
您确实需要通过调试器运行它。
您的递归每次只会跟随一条路径,因为您正在使用else if
语句。如果它找到一条免费的路径,它将跟随它而只有那条路径。这在你当前的情况下是正常的(下面的修复),因为它可以穿过板和向下,但它将失败与更复杂的板(例如一个有墙)。
您的实际问题是一个简单的错字,您可以通过在程序运行时查看i,i1和i2的值来找到调试器。
这段代码:
if(i2 < 0)
{
i1 = i;
}
检查i2 ,但更改i1 。这意味着当i为0时,i1设置为1,i2设置为-1,然后i1再次设置为0。因此,您的计划永远不会顺利进行。
应该是
if(i2 < 0)
{
i2 = i;
}