NEQUoj的汉诺塔我的代码通过率为50%求大佬帮忙看看 - 爱问答

(爱问答)

NEQUoj的汉诺塔我的代码通过率为50%求大佬帮忙看看

古老的汉诺塔问题是:用最少的步数将N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动过程中小盘永远在大盘上边。 现在再加上一个条件:不允许从1号柱直接把盘移动到3号柱, 也不允许从3号柱直接移动到1号柱。把盘按半径从小到大1——N进行编号。每种状态用N个整数表示, 第i个整数表示第i号盘所在的柱的编号。则N=2时的移动方案为(1,1)》(2,1)》(3,1)》(3,2)》(2,2)》(1,2)》(1,3)》(2,3) 》(3,3)初始状态为0步,变成求在某步数时的状态。

输入:

输入文件的第一行为整数T(1<=T<=100),表示输入数据的组数。接下来的T行,每行有两个整数N,M(1<=N<=19, 0<=M<=移动N个圆盘需要的次数)

输出:

输入文件一共T行对于每组输入数据,输出N个整数表示移动N个盘在M步时的状态,每两个数之间用一个空格隔开,行首和行末不要有多余的空格。


#include<cstdio>

long long a[25];

int p[25];

 

void site(int l1,int l2,int l3,int n,int m)

{

if(n==0) return ;

if(m<a[n-1]+1)

{

p[n]=l1;

site(l1,l2,l3,n-1,m);

return ;

}

if(m<a[n-1]*2+2) 

{

p[n]=l2;

site(l1,l2,l3,n-1,m-(a[n-1]+1));

return ;

}

p[n]=l3;

site(l1,l2,l3,n-1,m-(a[n-1]+1)*2);

return;

}

 

int main()

{

int n,t;

long long m;

a[0]=0;

for(int i=1;i<=19;i++)

a[i]=a[i-1]*3+2;

scanf("%d",&t);

while(t--)

{

scanf("%d%lld",&n,&m);

for(int i=1;i<=n;i++)

p[i]=1;

site(1,2,3,n,m);

printf("%d",p[1]);

for(int i=2;i<=n;i++)

printf(" %d",p[i]);

printf(" ");

}

return 0;

}


#include<stdio.h>int step=0;void move(char s, char t, int d){int i,j;step++;printf("第 %d 步: %c->%c ",step,s,t);}void hanoi(char a, char b, char c, int n){if(n==1){move(a,b,n);}else{hanoi(a,c,b,n-1);move(a,b,n);hanoi(c,b,a,n-1);}}int main(){int i,n;printf("n=?");scanf("%d",&n);hanoi('A','C','B',n);return 0;}


下一篇:数学问题,请各大神帮解

上一篇:帮我猜一猜一个美国动画角色谢谢了

热门标签:
英语 谜语 作文 数学 公式 语文 物理 化学 工艺 java c语言 实验 方程 金属 分子 数据库 硫酸 酒精 运算 石油 vc 世界大战 php 化合物 mysql
最新更新:
电学的一个小问题 为什么打点计时器只能粗略瞬时速度 lookdownupon用法 中专都考不上大学有必要复读一年吗? 如图,已知∠B=∠DEF,AB=DE,请添加一个条件使△ABC≌△DEF,则需添加的条件是__________. 求曲线y=2x^2和直线y=2的所围图形的面积 夜上受降城闻笛是哪句 这个怎么填数字? 小明家下五层楼是5楼,那么小明家上五层楼是几层楼? 填空题,这个题目是怎么算的呢…… 22335577()143中括号里填什么数字。 懂得人帮我看一下这个英文是啥意思??? 最小的物质单位是什么 怎么估算根号52000000 about的重读字母是哪里