| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1663 人关注过本帖, 4 人收藏
标题:汉诺塔动画版
只看楼主 加入收藏
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
结帖率:100%
收藏(4)
已结贴  问题点数:20 回复次数:6 
汉诺塔动画版
#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编辑过]

搜索更多相关主题的帖子: int temp case printf break 
2018-04-17 20:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
先收藏一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-17 20:57
晨阳、
Rank: 2
等 级:论坛游民
帖 子:44
专家分:20
注 册:2017-3-4
收藏
得分:5 
为什么我复制过去一堆堆错误

                          --------    一个刚学C语言不久的小白
2018-04-18 10:16
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:379
专家分:820
注 册:2013-4-18
收藏
得分:5 
有的版本循环体内不能定义变量,要将for(int i)改成int i; for()
2018-04-18 10:22
ab1412
Rank: 7Rank: 7Rank: 7
来 自:M78星球
等 级:黑侠
威 望:4
帖 子:103
专家分:537
注 册: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: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用晨阳、在2018-4-18 10:16:09的发言:

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

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

用.cpp编译~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-18 16:54
aftwl
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-1-2
收藏
得分:0 
秀啊楼主,稳的一批
2019-01-02 19:25
快速回复:汉诺塔动画版
数据加载中...
 
   



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

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