汉诺塔VIII
来源:互联网 发布:Linux aria2 下载出错 编辑:程序博客网 时间:2024/05/01 10:48
题目来源:hdu2184
汉诺塔VIII
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 260 Accepted Submission(s): 155
Problem Description
1,2,...,n表示n个盘子.数字大盘子就大.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次后的状况.
Input
第1行是整数T,表示有T组数据,下面有T行
每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1
每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1
Output
输出移动m次后的状况.每组输出3行,第i行第1个数是第i根柱子上的盘子数,然后是盘子的号数.
Sample Input
33 24 539 183251937942
Sample Output
1 31 21 12 4 11 31 213 39 36 33 30 27 24 21 18 15 12 9 4 112 38 35 32 29 26 23 20 17 14 11 8 514 37 34 31 28 25 22 19 16 13 10 7 6 3 2
Author
Zhousc
Source
ECJTU 2008 Summer Contest
Recommend
lcy | We have carefully selected several similar problems for you: 1002 2182 2180 2177 1078
解析:模拟;
首先预处理一个f[],f[i]表示将 i 个盘子从A——>C所需要的次数,f[1]=1,f[i]=f[i-1]*2+1。
①考虑 n 号盘子,移动方向A——>C;
②若m==f[n],则正好 n 个盘子完全从A——>C;
③若m>f[n-1],则n号盘子移动到了C ,其上的n-1个盘子正处于从B——>C的移动过程中,此时考虑盘号n-1,移动方向B——>C,移动次数m-f[n-1]-1;
④若m<=f[n-1],则 n 号盘子依然在A上,其上的n-1个盘子正处于从A——>B的移动过程中,此时考虑盘号n-1,移动方向A——>B,移动次数m;
⑤重复①②③④;
代码:
#include<cstdio>#define maxn 63using namespace std;long long f[maxn+10],a[4][maxn+10];void redirect(){ freopen("hdu2184.in","r",stdin); freopen("hdu2184.out","w",stdout);}void init(){ int i,j,k; for(f[1]=1,i=2;i<=maxn;i++)f[i]=f[i-1]*2+1;}void dfs(int s,int z,int e,long long n,long long m){ int i,j,k; if(n<=0)return; if(m==f[n]) { k=a[e][0],a[e][0]+=n; for(i=n;i>=1;i--)a[e][k+i]=i; return; } if(m>f[n-1]) { a[e][++a[e][0]]=n; m=m-f[n-1]-1,n--; dfs(z,s,e,n,m); return; } a[s][++a[s][0]]=n; n--; dfs(s,e,z,n,m); }void write_ans(){ int i,j,k; for(i=1;i<=3;i++) { printf("%d",a[i][0]); if(a[i][0]<=0){printf("\n");continue;} for(j=1;j<=a[i][0];j++)printf(" %d",a[i][j]); printf("\n"); }}void work(){ init(); int t,i,j,k; long long n,m; while(scanf("%d",&t)==1) for(i=1;i<=t;i++) { scanf("%I64d%I64d",&n,&m); a[1][0]=a[2][0]=a[3][0]=0;dfs(1,2,3,n,m);write_ans(); }}int main(){ redirect(); work(); return 0;}
0 0
- 汉诺塔VIII
- 汉诺塔VIII
- HDU 2184 汉诺塔VIII
- Hdu2184汉诺塔VIII
- VIII
- 汉若塔系列续:汉诺塔VIII、汉诺塔IX、汉诺塔X。
- HDU 1997、2184、2175、2511 汉诺塔VII、VIII、IX、X
- ALV参考文档(VIII)
- 世界最佳免费软件VIII
- leetcode随笔VIII
- 【HUSTOJ】1075: 拐角VIII
- Linux学习总结 Part-VIII
- CSI-VIII:链接-程序构建
- [Rx86OS-VIII] 接收鼠标数据
- HDU 多校 VIII 1008 clock
- BZOJ3739: DZY loves math VIII
- VIII-The Offer and Beyond
- VIII. Spring Boot Maven插件
- php连mysql报错:Call to undefined function mysql_connect()
- 直方图均衡化处理图像(python)
- 降息后主流互联网理财产品恐难保四,仍有部分坚挺
- warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
- Android系统根目录结构及说明
- 汉诺塔VIII
- ================= 华 丽 的 分 割 线====================
- 《Agile Java》学习指南001
- Redis快速入门
- map方法总结
- 让Lua和C++牵手
- 算法学习之字符串左移和右移
- 栈的顺序存储结构(进阶升级版)
- System.Threading.Timer定时刷新ListView示例