日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汉诺塔 X HDU - 2511

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉诺塔 X HDU - 2511 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:

1,2,…,n表示n個盤子.數(shù)字大盤子就大.n個盤子放在第1根柱子上.大盤不能放在小盤上.在第1根柱子上的盤子是a[1],a[2],…,a[n]. a[1]=n,a[2]=n-1,…,a[n]=1.即a[1]是最下面的盤子.把n個盤子移動到第3根柱子.每次只能移動1個盤子,且大盤不能放在小盤上.問第m次移動的是哪一個盤子,從哪根柱子移到哪根柱子.例如:n=3,m=2. 回答是 :2 1 2,即移動的是2號盤,從第1根柱子移動到第2根柱子 。

Input

第1行是整數(shù)T,表示有T組數(shù)據(jù),下面有T行,每行2個整數(shù)n (1 ≤ n ≤ 63) ,m≤ 2^n-1

Output

輸出第m次移動的盤子號數(shù)和柱子的號數(shù).

Sample Input

4
3 2
4 5
39 183251937942
63 3074457345618258570

Sample Output

2 1 2
1 3 1
2 2 3
2 2 3

分析:

漢諾塔
一號柱有n個盤子,叫做源柱.移往3號柱,叫做目的柱.2號柱叫做中間柱.
全部移往3號柱要f(n)=(2n)?1f(n)=(2^n)-1f(n)=(2n)?1次.
最大盤n號盤在整個移動過程中只移動一次,n-1號移動2次,i號盤移動2(n?i)2^{(n-i)}2(n?i)次.
1號盤移動次數(shù)最多,每2次移動一次.
第2k+1次移動的是1號盤,且是第k+1次移動1號盤.第4k+2次移動的是2號盤,且是第k+1次移動2號盤.
(2s)k+2(s?1)(2^{s})k+2^{(s-1)}(2s)k+2(s?1)移動的是s號盤,這時s號盤已被移動了k+1次.每2s2^s2s次就有一次是移動s號盤.
第一次移動s號盤是在第2(s?1)2^{(s-1)}2(s?1)次.
第二次移動s號盤是在第2s+2(s?1)2^s+2^{(s-1)}2s+2(s?1)次.

第k+1次移動s號盤是在第k?2s+2(s?1)k*2^{s}+2^{(s-1)}k?2s+2(s?1)次.1–2--3–1叫做順時針方向,1–3--2–1叫做逆時針方向.
最大盤n號盤只移動一次:1–3,它是逆時針移動.
n-1移動2次:1–2--3,是順時針移動.
如果n和k奇偶性相同,則k號盤按逆時針移動,否則順時針.

#include<bits/stdc++.h> using namespace std; int main() {int i, k;scanf("%d", &k);for (i = 0; i < k; i++){int n, l;__int64 m, j;__int64 s, t;scanf("%d%lld", &n, &m);s = 1;t = 2;for (l = 1; l <= n; l++){if (m % t == s)break;s = t;t *= 2;}printf("%d ", l);j = m / t;if (n % 2 == l % 2){ // 逆時針if ((j + 1) % 3 == 0)printf("2 1\n");if ((j + 1) % 3 == 1)printf("1 3\n");if ((j + 1) % 3 == 2)printf("3 2\n");}else{ // 逆時針if ((j + 1) % 3 == 0)printf("3 1\n");if ((j + 1) % 3 == 1)printf("1 2\n");if ((j + 1) % 3 == 2)printf("2 3\n");}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的汉诺塔 X HDU - 2511的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。