汉诺塔

http://pan.baidu.com/s/1cTtGq

使用vs2008进行编译





// hanoric.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
 
//定义最大盘子编号
#define N 6
struct pan{
  int num;
  char pos;
};
 
int count = 0;
//A,B,C分别代表A杆,B杆,C杆
char A ='A';
char B = 'B';
char C = 'C';
 
struct pan data[8];
//用于移动盘子,其中src代表开始杆,mid代表中间暂存杆,des代表目的杆,m代表盘子的编号
void hanorio_move(char src,char mid,char des,int m);
//用于移动只有一个盘子的时候
void move (char src,char des);
//用于初始化汉诺塔
void hanorio_init(struct pan data[],int len);
//打印汉诺塔
void print_hanrio(struct pan data[]);
 
int get_num(char src,char des);
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
hanorio_init(data,N);
hanorio_move(A,B,C,N);
 
printf("total is:%d",count);
return 0;
}
//用于初始化汉诺塔
void hanorio_init(struct pan data[],int len)
 
{
int i =0;
for (i =0; i<len;i++)
{
data[i].num = i+1;
data[i].pos='A';
}
 
 
}
 
 
//用于盘子的移动,采用递归的方式
void hanorio_move(char src,char mid,char des,int m)
 
{
if(m==1)
{
move(src,des);
return;
}
//把杆上的m-1个盘子先移动mid,然后把剩下的那个盘子移动到des杆
hanorio_move(src,des,mid,m-1);
move(src,des);
hanorio_move(mid,src,des,m-1);
 
 
}
 
//当盘子只有一个的时候进行移动
void move (char src,char des)
 
{
//获得移动盘子的编号,因为盘子按大小排列,那么只有最小的盘子才可以移动
int number = 0;
count++;
 
//获得src上的盘子的编号并进行标记为已经移动到des
number = get_num(src,des);
 
printf("第 %d步\n",count);
printf("编号为%d的盘子 ",number);
printf("%c 移动到 %c\n",src,des);
print_hanrio(data);
 
}
 
//获得src上的盘子的编号并进行标记为已经移动到des
int get_num(char src,char des)
 
{
int i = 0;
int min =N;
for(i=0;i<N;i++)
{
if(data[i].pos == src)
{
min>data[i].num?min =data[i].num:min;
break;
}
}
//设置移动的盘子的杆的位置
data[i].pos=des;
 
return min;
 
}
 
 
//打印汉诺塔
void print_hanrio(struct pan data[])
{
int i = 0;
int c = 0;
int ib = 0;
 
 
//依次打印A,B,C杆上的盘子
printf("--A杆\n");
 
for(i=0;i<N;i++)
{
ib = 0;
if(data[i].pos=='A')
{
c=data[i].num;
ib = N-data[i].num;
 
//用于打印偏移最大盘子的位置,如编号为1,最大为4,那么1前面需要(4-1)个‘ ‘
while(ib-->0)
printf(" ");
//根据盘子的编号,打印盘子大小
while( (c-=1)>=0 )
{
printf("* ");
}
printf("\n");
}
}
printf("--------------------------------\n");
 
printf("--B杆\n");
for(i=0;i<N;i++)
{
ib = 0;
if(data[i].pos=='B')
{
c=data[i].num;
ib = N-data[i].num;
 
//用于打印偏移最大盘子的位置,如编号为1,最大为4,那么1前面需要(4-1)个‘ ‘
while(ib-->0)
printf(" ");
//根据盘子的编号,打印盘子大小
while( (c-=1)>=0 )
{
printf("* ");
}
printf("\n");
}
}
 
printf("--------------------------------\n");
printf("--C杆\n");
 
for(i=0;i<N;i++)
{
ib = 0;
if(data[i].pos=='C')
{
c=data[i].num;
ib = N-data[i].num;
 
//用于打印偏移最大盘子的位置,如编号为1,最大为4,那么1前面需要(4-1)个‘ ‘
while(ib-->0)
printf(" ");
//根据盘子的编号,打印盘子大小
while( (c-=1)>=0 )
{
printf("* ");
}
printf("\n");
}
}
printf("--------------------------------\n");
}


你可能感兴趣的:(算法,汉诺塔)