论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

HANOI塔问题的动画演示

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:45:35


    对源程序的一点说明:
    在屏幕作图之前, 必须根据显示器适配器种类将显示器设置成为某种图形模

式, 在未设置图形模式之前, 微机系统默认屏幕为文本模式(80列, 25行字符模

式), 此时所有图形函数均不能工作。设置屏幕为图形模式, 可用下列图形初始

化函数:
     void far initgraph(int far *gdriver, int far *gmode, char *path);
    其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所
在的目录路径(即EGAVGA.BGI所在的目录路径)。   
    本程序中的initgraph函数调用形式为
    initgraph(&gdriver,&gmode,"c:\\tc20\\bgi"),其中"c:\\tc20\\bgi"是
我电脑上的图形驱动程序EGAVGA.BGI所在的目录路径。
    要使程序在别的电脑上运行,必须改成所在电脑上的图形驱动程序

EGAVGA.BGI所在的目录路径。
/*
  Name:     hanoime.c     
  Author:       zhuqing
  Des cription:      HANOI塔问题的递归解的动画演示  
  Date: 06-08-03 11:44
  Copyright:
*/
#include <stdlib.h>
#include <graphics.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#define N 5
#define COLOREXP (i+1)%15

/* 原柱,中间柱,目标柱初值数组 */
char a[]={'1','2','3','4','5','6','7','8','9'};
char b[]={'0','0','0','0','0','0','0','0','0'};
char c[]={'0','0','0','0','0','0','0','0','0'};
int step=0;
  int m;
  int gdriver,gmode;
  int stick1x,stick2x,stick3x;
  int base,top,stkwid;
  int thick,width;
  int startx,starty,endx,endy; 
  int *pic,size,i;
  int dif;
  int delaytime;
 
void disp(int);

void drawplate(int startx,int starty,int endx,int endy,int color){
    int i;
    setcolor(color);
    for(i=startx;i<=endx;i++)
        line(i,starty,i,endy);
}

main()
{

  thick=10;
  width=100;
  stkwid=10; 
  top=120;
  stick1x=120;
  stick2x=320;
  stick3x=520;
  dif=16;
  delaytime=800000; 
  printf("\n  Please choice disp mode: 1 automatic 2 step by step\n");
  scanf("%3d",&m);
  gdriver=DETECT;
  /* registerbgidriver(EGAVGA_driver); */
  initgraph(&gdriver,&gmode,"c:\\tc20\\bgi");
  setcolor(BLUE);
  setbkcolor(LIGHTCYAN);  
  base=getmaxy()-60;
  line(60,base+1,580,base+1);
  setwritemode(XOR_PUT);
  setlinestyle(0, 0, 1);   /*设置1点宽实线*/

 disp(N);
getch();
disp(N);
move(N,a,b,c);
getch();
closegraph();
}
/* 递归函数 */
move(int n,char a1[],char b1[],char c1[])
{
    int i=0;
    if(n>0){
        move(n-1,a1,c1,b1);

        c1[n-1]=a1[n-1];
        a1[n-1]='0';
        disp(N);
       
        while(i<N&&c[i]!='0')i++;
        if(i<N){
                if(m==1)
                delay(delaytime);
                else
                getch();
                disp(N);
        move(n-1,b1,a1,c1);
        }
    }   
}
/*  打印输出结果到屏幕的函数    */
void disp(int n)
{
int i;
int count;
int startx,starty,endx,endy;
int color;
  stick1x=120;
  stick2x=320;
  stick3x=520;
/* 画A柱的盘子*/ 
  count=0;
  starty=base;
for(i=0;i<N;i++){
    if(a[N-1-i]!='0'){
        color=COLOREXP;
        setcolor(color);
        startx=stick1x-(width-dif*i-stkwid)/2;
        starty=base-thick*(count+1)-count;
        endx=startx+(width-dif*i);
        endy=base-thick*count-count;           
        /* rectangle(startx,starty,endx,endy); */
        drawplate(startx,starty,endx,endy,color); 
        count++;
    }
}
/* 画A柱*/
setcolor(BLUE);
rectangle(stick1x,top,stick1x+stkwid,starty);
/* 画B柱的盘子*/
  count=0;
  starty=base;
for(i=0;i<N;i++){
    if(b[N-1-i]!='0'){
        color=COLOREXP;
        setcolor(color);
        startx=stick2x-(width-dif*i-stkwid)/2;
        starty=base-thick*(count+1)-count;
        endx=startx+(width-dif*i);
        endy=base-thick*count-count;            
        /* rectangle(startx,starty,endx,endy); */
        drawplate(startx,starty,endx,endy,color);
        count++;
    }   
}
/* 画B柱*/
setcolor(BLUE);
rectangle(stick2x,top,stick2x+stkwid,starty);
/* 画C柱的盘子*/
  count=0;
  starty=base; 
for(i=0;i<N;i++){
    if(c[N-1-i]!='0'){
        color=COLOREXP;
        setcolor(color);
        startx=stick3x-(width-dif*i-stkwid)/2;
        starty=base-thick*(count+1)-count;
        endx=startx+(width-dif*i);
        endy=base-thick*count-count;            
        /* rectangle(startx,starty,endx,endy); */
        drawplate(startx,starty,endx,endy,color);          
        count++;
    }   
}
/* 画C柱*/
setcolor(BLUE);
    rectangle(stick3x,top,stick3x+stkwid,starty);
}

上一篇:{应用}HANOI塔问题的非递归解 人气:6047
下一篇:{应用}堆排序算法的过程演示 人气:7399
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058