C++ 如何处理复杂算法中的goto函数?
我删除了我的项目中的4个goto函数,但我无法处理它。我希望你能帮助我 我在密码上标记了他。我尝试过破洞法,但不管用,我也尝试过如果,但我无法控制自己 我随机生成了一个数字。有时会给出真实的分数,但大多数情况下,它卡在某个地方,我发现它卡在那里,但在我的路上没有解决方案。其他的移除效果很好,但那一个不起作用C++ 如何处理复杂算法中的goto函数?,c++,c,C++,C,我删除了我的项目中的4个goto函数,但我无法处理它。我希望你能帮助我 我在密码上标记了他。我尝试过破洞法,但不管用,我也尝试过如果,但我无法控制自己 我随机生成了一个数字。有时会给出真实的分数,但大多数情况下,它卡在某个地方,我发现它卡在那里,但在我的路上没有解决方案。其他的移除效果很好,但那一个不起作用 void Solve() { if (check == 0) flag1 = 0; else if (flag1 != 0) {
void Solve()
{
if (check == 0)
flag1 = 0;
else if (flag1 != 0)
{
check3 = check;
while (1)
{
check2 = 0;
while (1)
{
while (check2 < check)
{
{
x = check4[check2];
z = rowInc[x];
for (y = 0; y <= length-1; y++)
{
if (count1[y])
{
int delMatrix;
delMatrix = mainMatrix[x][y] - z + colEq[y];
if (delMatrix < count1[y])
{
if (delMatrix == 0)
{
if (rowEq[y] < 0)
{
goto breakthru; //This section I want to remove
//searching();
//break2 = true;
//break;
//flag4 = 0; break;
}
count1[y] = 0;
rowEq2[y] = x;
check4[check++] = rowEq[y];
}
else
{
count1[y] = delMatrix;
count1Row[y] = x;
}
}
}
}
}
check2++;
flag4 = 1;
}
if (1)
{
z = lengthH;
for (y = 0; y < length; y++)
{
if (count1[y] && count1[y] < z)
z = count1[y];
}
for (check2 = 0; check2 < check; check2++)
{
rowInc[check4[check2]] += z;
}
for (y = 0; y < length; y++)
{
if (count1[y])
{
count1[y] -= z;
if (count1[y] == 0)
{
x = count1Row[y];
if (rowEq[y] < 0)
{
for (j = y + 1; j < length; j++)
if (count1[j] == 0)
{
colEq[j] += z;
}
break1 = true;
break;
}
else
{
rowEq2[y] = x;
check4[check++] = rowEq[y];
}
}
}
else
colEq[y] += z;
}
if (break1)break;
}
}
breakthru:
一种方法是创建子函数并使用return:
void bar() {
while (1)
{
while (check2 < check)
{
{
x = check4[check2];
z = rowInc[x];
for (y = 0; y <= length-1; y++)
{
if (count1[y])
{
int delMatrix;
delMatrix = mainMatrix[x][y] - z + colEq[y];
if (delMatrix < count1[y])
{
if (delMatrix == 0)
{
if (rowEq[y] < 0)
{
return; // Return here.
}
count1[y] = 0;
rowEq2[y] = x;
check4[check++] = rowEq[y];
}
else
{
count1[y] = delMatrix;
count1Row[y] = x;
}
}
}
}
}
check2++;
flag4 = 1;
}
{
z = lengthH;
for (y = 0; y < length; y++)
{
if (count1[y] && count1[y] < z)
z = count1[y];
}
for (check2 = 0; check2 < check; check2++)
{
rowInc[check4[check2]] += z;
}
for (y = 0; y < length; y++)
{
if (count1[y])
{
count1[y] -= z;
if (count1[y] == 0)
{
x = count1Row[y];
if (rowEq[y] < 0)
{
for (j = y + 1; j < length; j++)
if (count1[j] == 0)
{
colEq[j] += z;
}
break1 = true;
break;
}
else
{
rowEq2[y] = x;
check4[check++] = rowEq[y];
}
}
}
else
colEq[y] += z;
}
if (break1)break;
}
}
}
breakthru:之后没有任何代码,因此我假设您希望函数在到达goto breakthru;时立即停止;。在这种情况下,更换goto breakthru;有回报;和removebreakthru:。坦白地说,在非平凡算法和平凡算法中使用goto的最佳方法不是。使用goto来获得任何好处并不容易。这在复杂的算法中并不容易。如果你将可恢复性和可维护性考虑到分类中,那么情况会更糟,答案肯定是永远不会。在尝试修复某些代码之前,你首先需要知道它应该做什么。从这个球上看不清楚它应该做什么。如果你想得到帮助,从使用goto改为不使用good choice,你应该提供更多关于程序应该做什么以及更改后的程序如何不工作的信息。理想情况下,两者都可以通过分别提供一个来实现,包括结果输出/行为和期望的输出/行为。我建议您试着识别逻辑块,您可以使用适当的接口将其分解为不同的函数。这里的goto远不是你唯一的问题。这个代码应该做什么?在你开始用旗子取代gotos之前是什么样子的?有时使用goto实际上是更好的选择,尽管我怀疑在这种情况下它不是最好的选择。更有可能的是,获得多重回报将是解决这一问题的关键。但是这个代码的问题不在于转到。
void Solve()
{
if (check == 0)
flag1 = 0;
else if (flag1 != 0)
{
check3 = check;
while (1)
{
check2 = 0;
bar();
// breakthru:
// ...
}
// ...
}
// ...
}