试图解决河内的塔,我真的不明白为什么我的功能无法正常工作。我已经在这里检查了每个C++解决方案。用10块板解决河内塔递归C++
bool CPlayer::MoveTop(int n, int from, int to)
{
if (n == 0)
{
m_towers.MoveDisc(to, 1);
return true;
}
MoveTop(n -1 , from , 1);
m_towers.MoveDisc(1,from);
MoveTop(n - 1, 1, to);
}// MoveTop
其中1是中间挂钩。而m_tower.MoveDisc(从,)将一张光盘从一个钉到另一个钉。
这是第一次调用MoveTop函数。
void CPlayer::OnRun()
{
bool ok = MoveTop(10,0,2);
}// OnRun
我也得到一个返回上称为PEG板数的高度的功能,但我真的不认为我需要它。
增加了更多的问题形容 的移动的所有图形中的窗口,在这里,我可以看到的板如何从栓移动到栓的结果被示出。而现在,它不会简单地做它应该做的。在运行代码时,第一个平台移动到桩1(中间的桩)并“上下跳动”。
这些都是可用的功能:
高度功能:
int CTowers::Height(int tower)
{
ASSERT(torn>=0 && torn<3);
return m_height[torn];
}
具体的塔返回的高度。
int CTowers::TopSize(int tower)
{
int h = Height(tower);
if (h==0)
return 1000;
else return DiscSize(torn, h-1);
}
返回挂钩上的大小。
int CTowers::DiscSize(int tower, int place)
{
ASSERT(place < Height(torn));
return m_pinne[tower][place];
}
返回指定的dicssize。
bool CTowers::MoveDisc(int to, int from)
{
if (m_abort)
return false; //
m_pView->DrawAnimation(from, to);
if (TopSize(from)>=TopSize(to))
return false;
m_numMoves++;
int ds = Pop(from);
Push(to, ds);
m_pView->Invalidate();
return true;
}
将光盘从一个挂钩移动到另一个挂钩。
请描述你的功能不起作用的方式。 – 2014-10-16 17:09:14
你一定要调用'm_towers。MoveDisc(to,1);'在递归函数之外,因为在所有后续调用之前(由于函数的递归性质)“拆除”了这些塔。顺便说一下,这个函数假设'from!= 1'和'to!= 1'。 – 2014-10-16 17:27:30
@barakmanos你能发展你的想法吗?我应该只有'm_towers.MoveDisc(1,from);'函数内部吗?我真的不明白你谈论的问题。 – 2014-10-16 17:44:22