2011-04-26 3 views
0

こんにちは私はハノイの塔で問題に直面しています:
交互に積み重ねられた交互の色のシリンダーのスタックが与えられます。
ジョブは、同じ色の2つのスタック
を分離することである私は、再帰を使用して、ハノイの定期的なタワーのためのコード(アルゴリズム)を書くことができますが、私はこの部分を把握することはできませんよ。助けてもらえますか?通常のハノイ問題の
コード:
ハノイの塔の問題

#include<iostream> 

using namespace std; 
int count=0; 

void hanoi(char a,char b,char c,int x) 
{ 
    if(x>1) 
    { 
    hanoi(a,c,b,x-1); 
    hanoi(a,b,c,1); 
    hanoi(c,b,a,x-1); 
    } 
    else 
    { 
    cout<<"Move a Disk from "<<a<<" to "<<b<<endl; count++; 
    } 
} 

int main() 
{ 
    int n; 
    cout<<"Enter the height of stack"; 
    cin>>n; 
    hanoi('A','B','C',n); 
    cout<<"\nNo. of changes done:"<<count; 

    return 0; 
} 
+4

をあなたは本当に、より構造化された方法で、あなたのコードをフォーマットする必要があります。ゼロインデントは、私は、このソリューションが動作する方法を正確に知っているにもかかわらず、あなたが貼り付けられ、読み、そのタフなものの中にあります。 – BSchlinker

+0

@ Johnan、それを掃除していただきありがとうございます。 – BSchlinker

+0

@Frustatedコーダー:**インデントあなたのコード**/8/<< - スターン見た顔。 – Johan

答えて

5

あなたが解決策を残すペグを交互に、問題にn回を解きます。

int main() 
{ 
    int n; 
    cout<<"Enter the height of stack"; 
    cin>>n; 

    char startPeg = 'A'; 
    char interPeg = 'B'; 
    char slnPeg = 'C'; 

    while(n > 0) { 
     hanoi(startPeg,interPeg,slnPeg,n); 
     n--; 
     char temp = startPeg; 
     startPeg = slnPeg; 
     slnPeg = temp; 
    } 

    return 0; 
} 

これはどのように動作するのですか。私たちのスタックが色赤(R)、イエロー(Y)を有し、それは背の高い5個の単位であることを言う:最初の実行後

 |   |   | 
    Y|Y   |   | 
    RR|RR   |   | 
    YYY|YYY  |   | 
RRRR|RRRR  |   | 
YYYYY|YYYYY  |   |  

、それは次のようになります。

 |   |   | 
    |   |   Y|Y  
    |   |   RR|RR 
    |   |  YYY|YYY 
    |   |  RRRR|RRRR 
    |   |  YYYYY|YYYYY 

を秒後実行し、それは次のようになります。3回目の後

 |   |   |  
    Y|Y   |   | 
    RR|RR   |   | 
    YYY|YYY  |   | 
RRRR|RRRR  |  YYYYY|YYYYY 

、それは次のようになります。

 |   |   |  
    |   |   Y|Y 
    |   |   RR|RR 
    |   |  YYY|YYY 
RRRR|RRRR  |  YYYYY|YYYYY 
前後の実行後

、この:5番目と最後の実行後

 |   |   |  
    |   |   | 
    Y|Y   |   | 
    RR|RR   |  YYY|YYY 
RRRR|RRRR  |  YYYYY|YYYYY 

、この:

 |   |   |  
    |   |   | 
    |   |   Y|Y 
    RR|RR   |  YYY|YYY 
RRRR|RRRR  |  YYYYY|YYYYY 

そして、あなたが行われているこの時点で。

あなたは再帰のために必死であれば、これを実行します。

void painful(char start, char inter, char sln, int n) { 
    if(n == 0) return; 
    hanoi(start,inter,sln); 
    painful(sln,inter,start,n-1); 
} 

int main() 
{ 
    int n; 
    cout<<"Enter the height of stack"; 
    cin>>n; 

    painful('A','B','C',n); 

    return 0; 
} 
+0

良い考えですがwhile文を使用する必要はありますか??? –

+1

あなたは 'n'回それを実行する必要がありますので、はいループが必要です。どんな種類のループを使ってもかまいません。あなたの後に拷問を楽しむことを楽しむなら、再帰を使うこともできます。 – riwalk

+0

ya ...だから私はどのようにこれで完全に再帰を使用し、中に排除するのですか?もしあなたが@FrustratedCoderに助けてくれるなら、私は感謝しています。今、再帰的な解決策があります。 –

0
#include <stdio.h> 
hanoi(char a, char b, char c, int h) { 
    if(h<=1){ 
     printf("move:%c to %c :\n", a, b); 
    }else{ 
     hanoi(a,c,b, h-1); 
     hanoi(a,b,c, 1); 
     hanoi(c,b,a, h-1); 
    } 
} 
main(){ 
    int input; 
    int i ; 
    scanf("%d", &input); 
    /* A is the src and B is dest */ 
    for(i=1; i< input ; i++){ 
     if(i%2){ 
      hanoi('A', 'B', 'C', input-i); 
     }else{ 
      hanoi('B', 'A', 'C', input-i); 
     } 
    } 
} 
// work ? 
関連する問題