hdu 1207 漢諾塔II (四柱漢諾塔)

來源:互聯網
上載者:User
思路是借鑒網上一大牛的,寫的很完美了,所以一句沒改,代碼是自己敲的,C語言版變體漢諾塔    問題描述:在經典漢諾塔的基礎上加一個條件,即,如果再加一根柱子(即現在有四根柱子a,b,c,d),計算將n個盤從第一根柱子(a)全部移到最後一根柱子(d)上所需的最少步數,當然,也不能夠出現大的盤子放在小的盤子上面。註:1<=n<=64;分析:設F[n]為所求的最小步數,顯然,當n=1時,F[n]=1;當n=2時,F[n]=3;如同經典漢諾塔一樣,我們將移完盤子的任務分為三步:(1)將x(1<=x<=n)個盤從a柱依靠b,d柱移到c柱,這個過程需要的步數為F[x];(2)將a柱上剩下的n-x個盤依靠b柱移到d柱(註:此時不能夠依靠c柱,因為c柱上的所有盤都比a柱上的盤小)     些時移動方式相當於是一個經典漢諾塔,即這個過程需要的步數為2^(n-x)-1(證明見再議漢諾塔一);(3)將c柱上的x個盤依靠a,b柱移到d柱上,這個過程需要的步數為F[x];第(3)步結束後任務完成。故完成任務所需要的總的步數F[n]=F[x]+2^(n-x)-1+F[x]=2*F[x]+2^(n-x)-1;但這還沒有達到要求,題目中要求的是求最少的步數,易知上式,隨著x的不同取值,對於同一個n,也會得出不同的F[n]。即實際該問題的答案應該min{2*F[x]+2^(n-x)-1},其中1<=x<=n;在用進階語言實現該演算法的過程中,我們可以用迴圈的方式,遍曆x的各個取值,並用一個標記變數min記錄x的各個取值中F[n]的最小值。數值不是很大,int完全可以搞定,代碼如下
#include<stdio.h>#include<math.h>#define M 99999999void main(){int i,n,x,min,f[65];f[1]=1;f[2]=3;for(i=3;i<=65;i++){min=M;for(x=1;x<i;x++)if(2*f[x]+pow(2,i-x)-1<min)min=2*f[x]+(int)pow(2,i-x)-1;f[i]=min;}while(~scanf("%d",&n))printf("%d/n",f[n]);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.