如果找不到解决方案,如何保留递归循环而不打印任何内容?

时间:2017-04-20 18:08:34

标签: c++

我有一个游戏,游戏的目的是找到21回合的解决方案。如果它找不到解决方案,它应该输出" No solution"并继续在主要。如果有一个解决方案,它应该上升到堆栈并输出每一步(现在向后退好)。

我正在试图弄清楚当我无法找到解决方案时如何离开我的堆栈而不打印任何东西。目前它将在21个回合中打印#34;无解决方案。"然后仍然上升,打印每一个动作。当有解决方案时,它确实有效。

bool TabletStock(int _tablets, int _turns) {
   if (_tablets == 18){
       cout << "Found solution. I have exactly 18 tablets, with " << 21 - _turns << " moves left.\n";
       return 1;
   }

   _turns++;

   if (_turns >= 21){
       cout << "No solution in 21 turns.\n";
       return 0;
   }

   if (_tablets % 2 == 1){
       TabletStock((++_tablets) / 2, _turns);
       cout << "After incrementing, reduce " << _tablets << " by half to get " << _tablets / 2 << ".\n";
   }
   else if (_tablets % 3 == 0 && _tablets % 18 == 0){
      TabletStock(_tablets / 3, _turns);
      cout << "With " << _tablets << ", divide by 3 to get " << _tablets / 3 << ".\n";
   }
   else{
      TabletStock((_tablets + 24), _turns);
      cout << "With " << _tablets << ", add 24 to get " << _tablets + 24 << ".\n";
   }
}

此时的函数调用是TabletStock(int,0);

我一直试图在&#34; if(_turns&gt; = 21)&#34;声明,因为它在打印所有步骤之前打印,所以如果我找到一种方法来打破&#34;打破&#34;从if语句中的堆栈开始,也许我可以让它不输出所有的cout步骤。

2 个答案:

答案 0 :(得分:1)

当您调用TabletStock()时,它将返回bool。每个印刷品都应该用if语句包装。如果它是假的,请不要打印。

例如,更改此内容:

TabletStock((_tablets + 24), _turns);
cout << "With " << _tablets << ", add 24 to get " << _tablets + 24 << ".\n";

要:

if(TabletStock((_tablets + 24), _turns))
{
    cout << "With " << _tablets << ", add 24 to get " << _tablets + 24 << ".\n";
}

答案 1 :(得分:0)

每次将结果附加到字符串变量中时,您可以将字符串存储在范围之外的变量中,或者将其添加到函数参数中。

if (_tablets % 3 == 0 && _tablets % 18 == 0) 
{
    mystring += "After incrementing, reduce ....... ";
    TabletStock(_tablets / 3, _turns);
} 

如果在最后:

if (_tablets == 18) 
{
    cout << mystring << endl;
    return 1;
}