Hanoi II——漢諾塔步數求解進階問題

在NOJ上遇到關於漢諾塔步數的求解問題spa

 

 

 

 開始讀時一臉懵逼,甚至不知道輸入的數據是什麼意思3d

題目描述:給出漢諾塔的兩個狀態,從初始狀態移動到目的狀態所須要的最少步數code

 


對於初級漢諾塔步數問題,咱們能夠直接經過公式進行求解,歸納來講,從一個柱子到另外一個柱子移動n個盤子,須要2的n次方-1步
blog

下面看一下輸入的是什麼數據,經過一個例子進行說明get

 

下面看問題的求解博客

 

 

 

 

 

 

 

 

 

 

 對題目的分析就到這,下面給出具體的程序:io

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long long fun(int *num,int i,int f)
{
    if(i<0)return 0;
    if(num[i]==f)return fun(num,i-1,f);
    return fun(num,i-1,6-num[i]-f)+(1LL<<(i-1));
}
int main()
{
    long long ans;
    int n;
    int start[60],target[60];
    while(scanf("%d",&n))
    {
        if(n==0)break;
        for(int i = 1;i<=n;i++)scanf("%d",&start[i]);
        for(int i = 1;i<=n;i++)scanf("%d",&target[i]);
        int index_end = n;
        ans = 0;
        while(index_end>=1 && start[index_end]==target[index_end]){
            index_end--;
        }
        if(index_end==0){
            printf("0\n");
            continue;
        }else{
            int other = 6-start[index_end]-target[index_end];
            ans = fun(start,index_end-1,other)+fun(target,index_end-1,other)+1;
            printf("%lld\n",ans);
        }

    }

    return 0;
}

第一次博客園的總結就這到這啦class

若是你們有疑問能夠留言討論程序

相關文章
相關標籤/搜索