2017-08-02 19 views
1

現在、私はハノイのパズルを解くすべての動きを示すプログラムを作成しています。私は最初の位置から始まるすべての動きを(A、A、A)として各ディスクの位置を示す必要があります。 A =第1のペグ、B =第2のペグ、およびC =第3のペグ。私は動きを出力するプログラムを持っていますが、位置はありません。プログラムにポジションを実装するにはどうすればよいですか?これまでの私のコードは、私の出力とそれぞれの移動後の位置がどうあるべきかを示す図です。ディスクの数は、constの下に3再帰を使用してハノイのパズルを解く

#include <iostream> 
using namespace std; 

void moveDiscs(int num,int fromPeg,int toPeg, int tempPeg){; 
char position; 
    if(num > 0){ 
     moveDiscs(num-1,fromPeg,tempPeg,toPeg); 
     cout << "Move a disc from peg "<<fromPeg<<" to peg "<<toPeg<<endl; 
     moveDiscs(num-1,tempPeg,toPeg,fromPeg); 
    } 
} 
int main() { 
    const int from_peg = 1; 
    const int to_peg = 3; 
    const int temp_peg = 2; 

    moveDiscs(3,from_peg,to_peg,temp_peg); 
    return 0; 
} 

Output

Diagram of Positions

+0

これは、あなたのコードに大きな追加を加えることなく行うことができるとは思えません。再帰的な解法は、解の各レベルで関数が完全な問題を解決すると考えていることです。したがって、再帰呼び出しで表されるサブ問題は、全体的な問題を認識することができず、記述した方法でディスクを追跡する機能がありません。 – shians

+0

私の解決策を見てください –

答えて

0

である私は、STLを使用していますそれぞれの動きを追跡し、解決して各ペグの位置 ある::マップのペグAました現在の解決策は制約の変更に基づいて更新することができます

#include <iostream> 
#include <map> 
#include <deque> 
using namespace std; 

map<int,deque<int>> bucket; 
deque<int> A{3,2,1}; 
deque<int> B; 
deque<int> C; 



void moveDiscs(int num,int fromPeg,int toPeg, int tempPeg){; 
    if(num > 0){ 
     moveDiscs(num-1,fromPeg,tempPeg,toPeg); 
     cout << "Move a disc from peg "<<fromPeg<<" to peg "<<toPeg<<endl; 
     auto val = bucket[fromPeg].front(); 
     bucket[fromPeg].pop_front(); 
     bucket[toPeg].push_front(val); 
     for (auto it:bucket) 
     { 
      cout << it.first << "::"; 
      for (auto di = it.second.begin(); di != it.second.end(); di++) 
      { 
       cout << "=>" << *di; 
      } 
      cout << endl; 
     } 

     moveDiscs(num-1,tempPeg,toPeg,fromPeg); 
    } 
} 
int main() { 

    bucket[1] = A; 
    bucket [2] =B; 
    bucket[3] = C; 
    const int from_peg = 1; 
    const int to_peg = 3; 
    const int temp_peg = 2; 

    moveDiscs(3,from_peg,to_peg,temp_peg); 
    return 0; 
} 

出力

Move a disc from peg 1 to peg 3 
1::=>2=>1 
2:: 
3::=>3 
Move a disc from peg 1 to peg 2 
1::=>1 
2::=>2 
3::=>3 
Move a disc from peg 3 to peg 2 
1::=>1 
2::=>3=>2 
3:: 
Move a disc from peg 1 to peg 3 
1:: 
2::=>3=>2 
3::=>1 
Move a disc from peg 2 to peg 1 
1::=>3 
2::=>2 
3::=>1 
Move a disc from peg 2 to peg 3 
1::=>3 
2:: 
3::=>2=>1 
Move a disc from peg 1 to peg 3 
1:: 
2:: 
3::=>3=>2=>1 
Program ended with exit code: 0 

ですから、ペグA(1 :: 3 => 2 => 1)から見ることができますは、CをPEGに移動させ、(3 :: 3 => 2 => 1)

関連する問題