今天刚刚搞明白这个问题,贴出来希望能给一些和我一样不是很懂的人一些参考,可惜的是我用的方法还不是特别方便, 以后有了更好的方法会继续和大家分享的。
这里我以一个经典的汉诺塔问题为例来进行说明。
【问题描述】有三个塔分别标为A、B、C。开始时,塔A上套了n个盘子。这里假定为3个。这些盘子的标号从1到3。并且在不失一般化的前提下,我们可以假设每个盘子的直径和它的标号相同。也就是说,盘子1的直径为1(采用某种长度单位),盘子2的直径为2,盘子3的直径为3。这3个盘子一开始按照1、2、3的顺序套在塔A上。现在要求把所有的盘子都移到塔C上。一次只能移动一个盘子,塔A、B和C都可以作为盘子移动的过渡位置。在每次移动之后,每个塔上的盘子必须按顺序出现。也就是说,不允许出现大盘子在小盘子上面的情况。
我们用递归来解决这一问题,下面是程序源码。
文件hanoi.h的源码:
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
extern int cnt; /* count of the number of moves */
int get_n_from_user(void);
void move(int n,char a,char b,char c);
文件main_p.c的源码如下:
#include "hanoi.h"
int cnt=0; /* count of the number of moves */
int main(void)
{
int n; /* number of disks */
n=get_n_from_user();
assert(n>0);
move(n,'A','B','C'); /* recursive fct */
getch();
return 0;
}
文件get.c的源码如下:
include "hanoi.h"
int get_n_from_user(void)
{
int n;
printf("%s",
"---/n"
"TOWERS OF HANOI:/n"
"/n"
"There are three towers:A,B and C./n"
"/n"
"The disks on tower A must be moved to tower C.Only one/n"
"disk can be moved at a time,and the order on each tower/n"
"must be preserved at each step. Any of the towers A,B,/n"
"or C can be used for intermediate placement of a disk./n"
"/n"
"The problem starts with n disks on Tower A./n"
"/n"
"Input n: ");
if(scanf("%d",&n)!=1||n<1)
{
printf("/nERROR :Positive integer not found - bye!/n/n");
exit(1);
}
printf("/n");
return n;
}
文件move.c的源码如下:
#include "hanoi.h"
void move(int n,char a,char b,char c)
{
if(n==1)
{
++cnt;
printf("%5d: %s%d%s%c%s%c./n",cnt,"Move disk ",1," from tower ",a," to tower ",c);
}
else
{
move(n-1,a,c,b);
++cnt;
printf("%5d: %s%d%s%c%s%c./n",cnt,"Move disk ",1," from tower ",a," to tower ",c);
move(n-1,b,a,c);
}
}
这时,我们要用以上几个源码文件生成一个exe文件,可以在C编译器的当前目录下新建一个工程文件(后缀名为.prj),这里我们新建hanoi.prj,在此文件中将所要编译的所有文件都包含进来,即写入以下代码:
hanoi.h
main1.c
get.c
move.c
然后打开C开发环境,载入hanoi.prj文件,打开project菜单,将project name 的值设为hanoi.prj,然后按F9编译即可生成hanoi.exe文件。
这里需要注意的是所有的源文件必须和编译器以及工程文件在同一目录下,我认为应该有办法使其在不同目录下时也能实现的,但是本人还没找到,以后找到了再告诉大家吧!