我对编程很陌生,对于我的面向对象的类(在C++中),我们有一个二维数组,其随机分组为“X”。我必须使用递归函数来找到不同的分组并清除它们。截至目前,我检查该点是否为X,将其清除,然后检查其周围的8个位置(包括对角线),如果X中有一个位置,则在该位置再次调用该函数。我的想法是,如果找到一个X,我将能够一次性获得周围所有X,因此,当我找到一个X时,我可以将其归为一组。
在函数的最后,我基本上遍历所有点,如果还有另一个X,则再次调用递归函数。但是,我一直在遇到分段错误,并且不确定为什么。任何帮助将不胜感激!
void Recurssive(string Array[][72],int Pos1, int Pos2)
{
int One=1;
int Two=1;
//cout<<"Test 2";
if(Array[Pos1][Pos2]=="X")
{
Array[Pos1][Pos2]="0";
if(Array[Pos1+1][Pos2]=="X")
{
Recurssive(Array,Pos1+1,Pos2);
}
if(Array[Pos1-1][Pos2]=="X")
{
Recurssive(Array,Pos1-1,Pos2);
}
if(Array[Pos1][Pos2+1]=="X")
{
Recurssive(Array,Pos1,Pos2+1);
}
if(Array[Pos1][Pos2-1]=="X")
{
Recurssive(Array,Pos1,Pos2-1);
}
if(Array[Pos1+1][Pos2+1]=="X")
{
Recurssive(Array,Pos1+1,Pos2+1);
}
if(Array[Pos1-1][Pos2-1]=="X")
{
Recurssive(Array,Pos1-1,Pos2-1);
}
if(Array[Pos1+1][Pos2-1]=="X")
{
Recurssive(Array,Pos1+1,Pos2-1);
}
if(Array[Pos1-1][Pos2+1]=="X")
{
Recurssive(Array,Pos1-1,Pos2+1);
}
}
for(int i=1;i<22;i++)
{
for(int j=1;j<72;j++)
{
if(Array[i][j]=="X")
{
Recurssive(Array,i,j);
}
}
}
}
这是我循环遍历的数组的输出
X
X
X XXXXXXXXXXXXXXX
X XXXXXXXXXXXXXXX
X XXXXXXXXXXXXXXX XXXX
XXXX XXXXXXXXXXXXXXX XXX XXX
X XXX XXX
XXXXXXXXXXXXXX X XXX XXX
XX XX X XXX XXX
XX XX X XXX XXX
XX XX X XXXX
XX XXXXX XX X
XX XX X
XX XX X
XXXXXXXXXXXXXX X
X
X
X
X
X
最佳答案
让我们玩电脑,然后进行Recurssive(Array, 0, 0)
的 Action 。
如果将此位置标记为X
,则将按顺序进行以下数组访问:
Array[1][0]
Array[-1][0]
Array[0][1]
Array[0][-1]
Array[1][1]
Array[-1][-1]
Array[1][-1]
Array[-1][1]
这些
-1
访问将超出Array
定义的内存范围,并且可能读取随机值或可能导致分段错误。为了解决这个问题,您需要在实际访问之前确认候选位置在木板内部。
就像是:
std::optional<std::string> safe_access(std::string Array[][72], int Pos1, int Pos2) {
if (Pos1 < 0 || Pos1 >= 71) return {};
if (Pos2 < 0 || Pos1 >= 21) return {};
return Array[Pos1][Pos2];
}
然后,您可以调用
safe_access(Array, -1, -1) == "X"
并确保它不会在Array
之外访问。关于c++ - 使用递归功能时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60190872/