D - N阶汉诺塔变形 朱雀 2021-03-28 13:52 461阅读 0赞 ## 题目描述 ## 相信大家都知道汉诺塔问题。那么现在对汉诺塔问题做一些限制,成为一个新的玩法。 在一个底座上,从左到右有三个分别命名为A、B和C的塔座,有n个大小不一的圆盘。这些圆盘一开始,从小到大按顺序叠加在塔座A上,形成一座上小下大的塔,塔座B和C为空。我们将n个圆盘,从小到大编号为1~n。现要求将塔座A上的n个圆盘移至塔座C上并仍按照同样的顺序叠排,圆盘移动时必须遵循以下规则: (1)每次只能将一个圆盘从一个塔座移动到相邻的塔座上 (2)所有圆盘可以叠在A、B和C中的任一塔座上 (3)任何时刻都不能将一个较大的圆盘压在较小的圆盘上面 那么问题来了,对于一个n阶(阶数即是问题中圆盘的个数)的上述问题,用最少操作次数将圆盘塔从塔座A移动到塔座C的操作总是固定的。请问,n阶问题执行k步操作后,塔座A、B和C上圆盘的情况是怎样的?从大到小输出三个塔座上的圆盘的编号(如果该塔座上没有圆盘,请输出0)。 比如,塔座A上有圆盘1,3;塔座B上有圆盘2;塔座C上有圆盘4。我们将输出: 3 1 2 4 ## 输入描述: ## 数据有多组,处理到文件结束。 每组数据一行输入,有两个整数n和k,n代表问题的阶数,k代表执行的步数。 ## 输出描述: ## 每组数据输出占三行。 第一行描述塔座A的情况。 第二行描述塔座B的情况。 第三行描述塔座C的情况。 示例1 ## 输入 ## 3 5 4 10 ## 输出 ## 3 1 2 0 4 3 1 2 ## 备注: ## 10000组数据。 对于100%的数据, 1 <= n < 40; 1 <= k < (3^n)。 ## 题解 ## 规律。 手动模拟一下$3$的时候,可以发现每个数字所在位置是存在规律的。 数字$1$的位置规律:123 321 123 321 数字$2$的位置规律:111222333 333222111 111222333 333222111 ...... #include<bits/stdc++.h> using namespace std; int n; long long k; long long b[50]; vector<int> g[5]; int main() { b[0] = 1LL; for(int i = 1; i < 40; i ++) { b[i] = b[i - 1] * 3LL; } while(~scanf("%d%lld", &n, &k)) { g[1].clear(); g[2].clear(); g[3].clear(); for(int i = n; i >= 1; i --) { long long p = k % (b[i] * 2LL); p = p / b[i - 1]; if(p <= 2) {} else p = 5 - p; p ++; g[p].push_back(i); } for(int i = 1; i <= 3; i ++) { if(g[i].size() == 0) printf("0\n"); else { for(int j = 0; j < g[i].size(); j ++) { printf("%d", g[i][j]); if(j < g[i].size() - 1) printf(" "); else printf("\n"); } } } } return 0; }
相关 汉诺塔 package com.someusefuldesign.demo; /假设有A B C三个柱子移动的顺序为: / public class 妖狐艹你老母/ 2022年08月13日 15:54/ 0 赞/ 241 阅读
相关 汉诺塔 Problem Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说。 开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着 Dear 丶/ 2022年06月17日 05:28/ 0 赞/ 322 阅读
相关 汉诺塔 汉诺塔 Time Limit: 1000MS Memory Limit: 65536KB [Submit][] [Statistic][] Prob 约定不等于承诺〃/ 2022年06月11日 03:24/ 0 赞/ 273 阅读
相关 汉诺塔 \include<stdio.h> void hanoi(int n,char A,char B,char C) \{ if(n==1) printf("Move s 逃离我推掉我的手/ 2022年06月10日 12:57/ 0 赞/ 320 阅读
相关 汉诺塔 include <stdio.h> void hannuota(int n,char A,char B,char C){ if(1 == n){ 川长思鸟来/ 2022年06月07日 13:06/ 0 赞/ 240 阅读
相关 汉诺塔 汉诺塔 Time Limit: 1000 ms Memory Limit: 65536 KiB [Submit][] [Statistic][] Problem D 怼烎@/ 2022年05月29日 05:58/ 0 赞/ 287 阅读
相关 汉诺塔变形 题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移 野性酷女/ 2022年05月29日 00:20/ 0 赞/ 145 阅读
相关 汉诺塔 def move(n, a, b, c): if n == 1: \ 如果a只有1盘子 print(a, '-->', c); \ 直接把盘子从a移到c els 迷南。/ 2022年05月18日 22:25/ 0 赞/ 348 阅读
相关 D - N阶汉诺塔变形 题目描述 相信大家都知道汉诺塔问题。那么现在对汉诺塔问题做一些限制,成为一个新的玩法。 在一个底座上,从左到右有三个分别命名为A、B和C的塔座,有n个大小不一的圆盘。这... 朱雀/ 2021年03月28日 13:52/ 0 赞/ 462 阅读
还没有评论,来说两句吧...