无锡高频热处理加工:递归算法》》调车头问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 01:07:10
铁路线A段中有n个车头,按图中所示的顺序编号为1...n。每个车头都可以在铁路上独立行驶,但规定当B或C段已有车头时,新进入这两段的车头号必须比该段中已有的车头号小。编程调用递归过程,将A段中车头的顺序颠倒过来
图n n-1 ....2 1 (a段) -----b段
————-c段
意思就是原来a中车头顺着排的,现在要通过b/c把它反过来排。
小弟苦思n久就想到是先把前n-1个放到b或c,再递归,就没辙了,这样想对吗?
不懂递归,所以冒死提问各位大虾怎样用VC++写出他的代码,算法又是什么呢*_*谢谢呢!!!!
b和c是并列的两车道

这个问题其实就是汉诺塔问题

在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由n个圆盘构成的塔[相当于铁路线A段排列的火车头]。目的是将最左边杆上的盘全部移到右边的杆上且排列方式不改变,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面[如果这个目的实现了,那么再依次从上往下把最右边的杆上的盘子移到最左边的杆,就实现了最左边杆上的盘的反序,约束条件正好一样]。

源代码:
#include<stdio.h>

void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
int main()
{
unsigned n;
printf("please enter the number of locomotive:");
scanf("%d",&n); //输入N值
printf("\tneedle:\t a\t b\t c\n");
movedisc(n,'a','c','b'); //从A上借助B将N个盘子移动到C上
//*********************************************************************
//在此处加入如下代码将C上的N个盘子再移回A 去掉此处代码即汉诺塔问题源代码
for(int j=1;j<=(int)n;j++)
{
i++;
printf("\t[%d]:\t%2d<-------------%2d\n",i,j,j);
}
//*********************************************************************
printf("\tTotal:\t%d\n",i);
scanf("%d",&n);
return 0;
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
//从fromneedle上借助toneedle将N-1个盘子移动到usingneedle上
movedisc(n-1,fromneedle,usingneedle,toneedle);
++i;
//将fromneedle 上的一个盘子移到toneedle上
switch(fromneedle)
{
case 'a':
switch(toneedle)
{
case 'b':
printf("\t[%d]:\t%2d----->%2d\n",i,n,n);
break;
case 'c':
printf("\t[%d]:\t%2d------------->%2d\n",i,n,n);
break;
}
break;
case 'b':
switch(toneedle)
{
case 'a':
printf("\t[%d]:\t%2d<-----%2d\n",i,n,n);
break;
case 'c':
printf("\t[%d]:\t\t%2d----->%2d\n",i,n,n);
break;
}
break;
case 'c':
switch(toneedle)
{
case 'a':
printf("\t[%d]:\t%2d<-------------%2d\n",i,n,n);
break;
case 'b':
printf("\t[%d]:\t\t%2d<-----%2d\n",i,n,n);
break;
}
break;
}
//从usingneedle上借助fromneedle将N-1个盘子移动到toneedle上
movedisc(n-1,usingneedle,toneedle,fromneedle);
}
}