2011-04-26 132 views
0

嗨大家好我在河內塔上遇到了一個問題:
我們給了一堆交替堆疊的交替顏色的圓柱體。
這個工作是分開兩個相同顏色的堆棧
我可以使用遞歸爲河內的普通塔編寫代碼(算法),但我無法弄清楚這一部分。有人可以幫忙嗎?定期河內問題
代碼:
河內之塔問題

#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 2011-04-26 20:27:21

+0

@Johnan,謝謝你的清理。 – BSchlinker 2011-04-26 20:28:07

+0

@Frustated Coder:**縮進代碼**/8-/<< - 嚴峻的臉。 – Johan 2011-04-26 20:29:31

回答

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 

第二後運行,它看起來像這樣:

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

第三次運行後,它看起來像這樣:

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

第四運行後,此:

 |   |   |  
    |   |   | 
    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語句是必需的? – 2011-04-26 20:38:28

+1

你必須運行'n'次,所以是循環是必需的。使用任何你想要的循環。如果你喜歡在你後面折磨​​那些人,你也可以使用遞歸。 – riwalk 2011-04-26 20:41:20

+0

亞...因此,我如何使用遞歸完全在這個消除而?我會很感激你,如果你能幫我解決這個問題 – 2011-04-26 20:49:39

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 ?