1. 程式人生 > >SDUTACM遞迴之漢諾塔系列2(基於C語言)

SDUTACM遞迴之漢諾塔系列2(基於C語言)

漢諾塔系列2

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem Description

用1,2,…,n表示n個盤子,稱為1號盤,2號盤,…。號數大盤子就大。經典的漢諾塔問 題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於 印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小 順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱 子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤。我們 知道最少需要移動2^64-1次.在移動過程中發現,有的圓盤移動次數多,有的少 。 告之盤 子總數和盤號,計算該盤子的移動次數.

Input

包含多組資料,每組首先輸入T,表示有T行資料。每行有兩個整數,分別表示盤子的數目N(1<=N<=60)和盤號k(1<=k<=N)。

Output

對於每組資料,輸出一個數,表示到達目標時k號盤需要的最少移動數。

Sample Input

2 60 1 3 1

Sample Output

576460752303423488 4

Hint

Source

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
long long int f(int p,int n)
{
    if(p==n)
        return 1;
    else
    {
        return 2*f(p-n,1);
    }
}
int main()
{int t,p,i,n;
while(scanf("%d",&t)!=EOF)
{
    for(i=1;i<=t;i++)
    {
        scanf("%d%d",&p,&n);
        printf("%lld\n",f(p,n));
    }
}
  return 0;
}
Think: 
當求第n個時候,如果s==n,那這個時候返回值為1,由於發現規律是從下往上依次是1,2,4,8,16,這樣,第N個時候實際上是第一個,第一個的時候就成了第n個,利用s-n來算,這樣的話,我們現在要求的就成了剩下的s-n中的第一個了,這樣依次往後求,就可以利用遞迴了;

相關推薦

java問題

原始碼的github地址,可以下載到本地執行 package stack.demo; /** * 漢諾塔問題: * 假設有三根柱子,x y z * x上有3個圓盤,從底部開始從大到小編號為n 到 1 * 若每次只能移動一個圓盤,且大圓盤不能在小圓盤上面 * 現在需要將3個

pos class 輸入 能力 else print adding -c 必須 遞歸的定義:一個函數自己直接或間接調用自己(一個函數調用另外一個函數和他調用自己是一模一樣的,都是那三步,只不過在人看來有點詭異。)遞歸滿足的三個條件:1、遞歸必須得有一個明確的終止條件2、該函

Python函數

info int code 大小 只需要 重新 個數 p s tar 漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子, 在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重

《零基礎入門學習Python》24--

前言 這節課主要講解用遞迴的方法,實現漢諾塔的解答  知識點 這節課主要講解用遞迴的方法,實現漢諾塔的解答  對於遊戲的玩法,我們可以簡單分解為三個步驟: 1) 將前63個盤子從X移動到Y上。  2) 將最底下的第64個盤子從X移動

方法----問題

遞迴思想解決 漢諾塔問題 1 package Recursive; 2 3 public class TestHanoi { 4 public static void main(String[] args) { 5 hanoi(3,'A','B','C'); 6

Java 通過求解問題 原始碼 經典問題講解

漢諾塔問題描述:有三根柱子 A、B、C ,在A從下向上按照從大到小的順序放著64個圓盤,以B為中介,把盤子全部移動到C上。移動過程中,要求任意盤子的下面要麼沒有盤子,要麼只能有比它大的盤子。 分析:為了將N個盤子從A移動到C,需要先把第N個盤子上面的N-1個盤子移動到B上,這樣才能將第

經典演算法

函式的遞迴 前進(規模縮小),邊界條件,返回段,自己呼叫自己 在寫漢諾塔之前 先給大家介紹下遞迴演算法 舉個例子:我要寫一個我自己的列印函式 Myprint()將12345 這個數 挨個數字 打印出來 void MyPrint(int n) { if(n > 10) M

問題

1.題目 2.思路     1、把A上面n-1個盤子移動到B上。    2、把A上最後一個移動到C;    3、把B上n-1個移動到A上,再把B上最後一個移動到C; 如此

經典解決

演算法:當只有一個盤子的時候,只需要從將A塔上的一個盤子移到C塔上。             當A塔上有兩個盤子是,先將A塔上的1號盤子(編號從上到下)移動到B塔上,再將A塔上的2號

【資料結構】演算法—

漢諾塔的問題,也是一個經典的遞迴演算法問題。 下面是自己總結的一張整體流程圖。 下面是程式碼,程式碼雖簡單,但理解其內部執行原理很重要。 //=========================

實現問題

雖然搞程式多年了,對遞迴演算法還是有些打怵。遞迴本身好理解,但其各層巢狀卻容易將人繞暈,遞迴的漢諾塔問題就將我搞暈了多次。我搜了好多資料,也查閱了好多書籍,但都是泛泛而談,不夠詳細,下面是我精心總結一下漢諾塔問題。 漢諾塔的問題:(百度百科引用) 漢諾塔問題是源於印度一個古

c語言實現

程式碼不是自己寫的,copy資料結構書上的,看的懂,但是寫不出來。 //程式碼很簡潔,但卻是經典 #include <stdio.h> int count =0; void move(char x,int n,char y) {     co

解決

漢諾塔簡介 大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。 經典題目:

演算法——問題

題目: 有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動? 解答過程: import java.util.Scanner

Java 實現問題

漢諾塔問題就是:有ABC三根柱子,A柱子上從上到下摞了很多體積依次遞增的圓盤,如果將圓盤從A移動到C柱子,且依然保持從上到下依次遞增。 class Hanio{ public void moveOn

C++_實現

A為存放盤子的塔,B為目標塔,C為輔助塔 演算法分為三步 一、將A上n-1個盤子全部放到C塔上 二、將A上剩下的一個盤子放到B塔上 三、將C塔上的盤子全部放到B塔上 注:不需要考慮如何移動n-

用Python實現問題

問題描述 漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,

1.0普通次數版

好吧,作為資訊統練中的基礎題,在網上確實找不到,因此我找了一道需要高精度的題進行改編 漢諾塔 時空限制1000ms / 128MB 題目背景 直達通天路·小A歷險記第四篇 題目描述

SDUT ACM小鑫の日常系列故事——排名次基於C語言

小鑫在來到SDUT之後,經過十分刻苦的學習和努力終於進入了ACM集訓隊。很快又一次ACM集訓隊的選拔就要開始了,集訓隊員們又忙碌了起來。他也十分幸運的被學長抓來當苦力。  o(∩_∩)o 這次學長給他分配的任務是寫一個自動排名的程式,我們知道當選拔賽結束的時候,每一個參與選拔的同學都會有一個自己的分數。而集訓