| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 248 人关注过本帖
标题:汉诺塔动画版
只看楼主 收藏
ehszt
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:31
帖 子:1631
专家分:2980
注 册:2015-12-2
结帖率:100%
  已结贴   问题点数:20  回复次数:5   
汉诺塔动画版
#include <stdio.h>
#include <windows.h>
#define N 4
int ak[3]={0};
int x1=20,y1=40;
int temp[3][9]={0};
void HideCursor()//隐藏光标
{
     HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
     CONSOLE_CURSOR_INFO cursor_info={1,0};
     SetConsoleCursorInfo(hOut,&cursor_info);
 }

void gotoxy(int x,int y)//设置字符显示位置
{
     HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
     COORD loc={x,y};
     SetConsoleCursorPosition(hOut,loc);
     
 }
 
void move(char a,char b)
{
    int m=a-'A',n=b-'A'; //把A,B,C柱信息转为0,1,2
    int k=-1;
    Sleep(2000); //每次输出休息2秒
    switch (m){
        case 0:ak[0]--;gotoxy(20,38-ak[0]*2);printf(" ");k=temp[0][ak[0]];temp[0][ak[0]+1]=0;break; //把要移动的数字保存到k,同时清零该位置数据
        case 1:ak[1]--;gotoxy(30,38-ak[1]*2);printf(" ");k=temp[1][ak[1]];temp[1][ak[1]+1]=0;break;
        case 2:ak[2]--;gotoxy(40,38-ak[2]*2);printf(" ");k=temp[2][ak[2]];temp[2][ak[2]+1]=0;break;
    }
    switch (n){
        case 0:ak[0]++;gotoxy(20,40-ak[0]*2);printf("%d",temp[0][ak[0]-1]=k);break;//把移动到的位置数据赋值k,并打印
        case 1:ak[1]++;gotoxy(30,40-ak[1]*2);printf("%d",temp[1][ak[1]-1]=k);break;
        case 2:ak[2]++;gotoxy(40,40-ak[2]*2);printf("%d",temp[2][ak[2]-1]=k);break;
    }
   
   
}

void hanoi (int a,char m,char b,char c)
{
    if(a==0)return;
    hanoi(a-1,m,c,b); //a-1个盘子从m利用c移动到b
    move(m,c);        //把m中的一个盘子移动到c
    hanoi(a-1,b,m,c); //a-1个盘子从b利用m移动到c
}

main()
{
   HideCursor();//隐藏光标
   gotoxy(x1,y1);
   printf("A");for(int i=0;i<9;i++)printf(" ");printf("B");for(int i=0;i<9;i++)printf(" ");printf("C");//打印A,B,C柱
   for(int i=0;i<N;i++)
   {
       gotoxy(20,38-i*2);
       printf("%d",i+1);
       temp[0][i]=i+1;   //temp数组是盘子的坐标信息
       ak[0]++;
   }    //打印初始数字摆放情况
   hanoi(N,'A','B','C'); //执行移盘
   gotoxy(20,50);   
}

[此贴子已经被作者于2018-4-18 10:53编辑过]

2018-04-17 20:29
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:40
帖 子:4669
专家分:13194
注 册:2016-10-22
  得分:5 
先收藏一下~

[code]/*~个性签名:皮……………………卡丘…………真的很……………………皮~ 2018-05-14更~*/[/code]
2018-04-17 20:57
晨阳、
Rank: 2
等 级:论坛游民
帖 子:44
专家分:20
注 册:2017-3-4
  得分:5 
为什么我复制过去一堆堆错误

                          --------    一个刚学C语言不久的小白
2018-04-18 10:16
dzy123
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:318
专家分:570
注 册:2013-4-18
  得分:5 
有的版本循环体内不能定义变量,要将for(int i)改成int i; for()
2018-04-18 10:22
ab1412
Rank: 4
等 级:业余侠客
威 望:1
帖 子:67
专家分:295
注 册:2018-3-15
  得分:5 
回复 3楼 晨阳、
#include <stdio.h>
#include <windows.h>
#define N 4
int ak[3]={0};
int x1=20,y1=40;
int temp[3][9]={0};
void HideCursor()//隐藏光标
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hOut,&cursor_info);
}

void gotoxy(int x,int y)//设置字符显示位置
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
   
}

void move(char a,char b)
{
    int m=a-'A',n=b-'A';
    int k=-1;
    Sleep(2000);
    switch (m){
    case 0:ak[0]--;gotoxy(20,38-ak[0]*2);printf(" ");k=temp[0][ak[0]];temp[0][ak[0]+1]=0;break;
    case 1:ak[1]--;gotoxy(30,38-ak[1]*2);printf(" ");k=temp[1][ak[1]];temp[1][ak[1]+1]=0;break;
    case 2:ak[2]--;gotoxy(40,38-ak[2]*2);printf(" ");k=temp[2][ak[2]];temp[2][ak[2]+1]=0;break;
    }
    switch (n){
    case 0:ak[0]++;gotoxy(20,40-ak[0]*2);printf("%d",temp[0][ak[0]-1]=k);break;
    case 1:ak[1]++;gotoxy(30,40-ak[1]*2);printf("%d",temp[1][ak[1]-1]=k);break;
    case 2:ak[2]++;gotoxy(40,40-ak[2]*2);printf("%d",temp[2][ak[2]-1]=k);break;
    }
   
   
}

void hanoi (int a,char m,char b,char c)
{
    if(a==0)return;
    hanoi(a-1,m,c,b);
    move(m,c);
    hanoi(a-1,b,m,c);
}

void main()
{
    gotoxy(x1,y1);
    printf("A");for(int i=0;i<9;i++)printf(" ");printf("B");for( i=0;i<9;i++)printf(" ");printf("C");
    for( i=0;i<N;i++)
    {
        gotoxy(20,38-i*2);
        printf("%d",i+1);
        temp[0][i]=i+1;
        ak[0]++;
    }
    hanoi(N,'A','B','C');
    gotoxy(20,50);   
}

可以试试这个看看行不行

printf("萌新一枚,请多指教");
2018-04-18 10:32
九转星河
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:长长久久
等 级:版主
威 望:40
帖 子:4669
专家分:13194
注 册:2016-10-22
  得分:0 
以下是引用晨阳、在2018-4-18 10:16:09的发言:

为什么我复制过去一堆堆错误

                          --------    一个刚学C语言不久的小白

用.cpp编译~

[code]/*~个性签名:皮……………………卡丘…………真的很……………………皮~ 2018-05-14更~*/[/code]
2018-04-18 16:54







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.086253 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved