2013-04-06 58 views
-1

我想寫標準河內塔algorythm,使用3杆和n盤。但我也想學習如何使用列表,所以我想我可以結合使用。河內塔 - 迭代,使用列表

我想過創造3個元素,每個元素代表單杆。它們中的每一個都將具有discs[]陣列,並且例如如果杆將具有5個盤,則陣列將包含[1, 2, 3, 4, 5]元素。好吧,我實現了結構等,但我的問題是 - 如何真正解決河內塔迭代?

是否可以循環使用棒狀物,並且每次檢查哪裏都可以,並將其移動到第一個檢查位置 - 然後重複循環?

回答

4

沒有必要過份使用你的生活與清單。使用數組。

#include <stdio.h> 

#define DISKS 4 // 10 max 
int stacks[3][DISKS]; 
int sps[3]; 

void init(int from) 
{ 
    int i; 
    sps[2] = sps[1] = sps[0] = 0; 
    for (i = 0; i < DISKS; i++) 
    stacks[from][i] = DISKS - i; // disk radius 
    sps[from] = DISKS; 
} 

void print(void) 
{ 
    int i, j, k; 
    for (i = DISKS - 1; i >= 0; i--) 
    { 
    for (j = 0; j < 3; j++) 
    { 
     if (sps[j] > i) 
     { 
     for (k = 0; k < 10 - stacks[j][i]; k++) 
      printf(" "); 
     for (k = 0; k < 2 * stacks[j][i]; k++) 
      printf("x"); 
     for (k = 0; k < 10 - stacks[j][i]; k++) 
      printf(" "); 
     } 
     else 
     { 
     printf("     "); // 10 * 2 
     } 
     printf(" "); 
    } 
    printf("\n"); 
    } 
    printf("_________/\\_________ _________/\\_________ _________/\\_________\n\n"); 
} 

void solve(int to, int from, int cnt) 
{ 
    int other = from^to^3; 

    if (!cnt) return; 

    solve(other, from, cnt - 1); 

    stacks[to][sps[to]++] = stacks[from][--sps[from]]; 
    print(); 

    solve(to, other, cnt - 1); 
} 

int main(void) 
{ 
    init(0); 
    print(); 
    solve(2, 0, DISKS); 
    return 0; 
} 

輸出(ideone):

  xx              
     xxxx              
     xxxxxx              
     xxxxxxxx              
_________/\_________ _________/\_________ _________/\_________ 


     xxxx              
     xxxxxx              
     xxxxxxxx     xx         
_________/\_________ _________/\_________ _________/\_________ 



     xxxxxx              
     xxxxxxxx     xx     xxxx   
_________/\_________ _________/\_________ _________/\_________ 



     xxxxxx          xx   
     xxxxxxxx          xxxx   
_________/\_________ _________/\_________ _________/\_________ 



                xx   
     xxxxxxxx    xxxxxx     xxxx   
_________/\_________ _________/\_________ _________/\_________ 



     xx              
     xxxxxxxx    xxxxxx     xxxx   
_________/\_________ _________/\_________ _________/\_________ 



     xx     xxxx         
     xxxxxxxx    xxxxxx        
_________/\_________ _________/\_________ _________/\_________ 


           xx         
           xxxx         
     xxxxxxxx    xxxxxx        
_________/\_________ _________/\_________ _________/\_________ 


           xx         
           xxxx         
          xxxxxx    xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 



           xxxx     xx   
          xxxxxx    xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 



                xx   
     xxxx     xxxxxx    xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 



     xx              
     xxxx     xxxxxx    xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 



     xx          xxxxxx   
     xxxx          xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 



                xxxxxx   
     xxxx     xx     xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 


                xxxx   
                xxxxxx   
           xx     xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 

                xx   
                xxxx   
                xxxxxx   
                xxxxxxxx   
_________/\_________ _________/\_________ _________/\_________ 
+0

哇,很酷:d我來分析這個,謝謝! – user2251921 2013-04-06 10:59:07

+0

感謝-1,誰是慷慨的人。我在其他答案中加入了代碼來對付過長的實現。 – 2013-04-06 11:02:15

+0

+1證明我的清白:)。優雅的解決方 – Deepu 2013-04-06 11:16:23