m0_68544987 2022-06-14 12:08 采纳率: 100%
浏览 50
已结题

求C语言汉诺塔可视化代码

我在网上找到的编译出来是cpp的,求帮我弄一个.c的,我改了俩天实在不会了

  • 写回答

2条回答 默认 最新

  • 白驹_过隙 算法领域新星创作者 2022-06-14 12:13
    关注

    img

    
    /*------------------------------------
    project : 汉诺塔演示软件;
    language:     C语言
    author:   404name
    叠64层需要开全窗口并且将字号调整为6
    ------------------------------------0-*/
    
    #include <stdio.h>
    #include <windows.h>
    int len, width, left, mid, right, time;
    
    char map[80][1000];
    
    int next[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //上0123;
    
    int turn[2][3] = {{0, 3, 1},  //a -> b   b -> c a -> c  上右下
                      {0, 2, 1}}; //b -> a  c -> b  c -> a    上左下
    void gotoxy(int x, int y)
    {
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD pos;
        pos.X = x;
        pos.Y = y;
        SetConsoleCursorPosition(handle, pos);
    }
    
    int init()
    {
        system("color 30");
        printf("请输入你要递归的\n汉诺塔数目_");
        int n;
        scanf("%d", &n);
        time = 50 / n;
        left = 1, mid = 2 * (n + 1), right = mid + 2 * n + 1;
        len = 3 * (2 * n + 1);
        width = n + 1;
        for (int i = 0; i <= width; i++)
        {
            for (int j = 0, num = i; j <= len; j++)
            {
                if (i == 0 || j == 0 || i == width || j == len)
                    map[i][j] = '#';
                if ((i > 1 && i < width) && (j == mid - 1 || j == right - 1))
                    map[i][j] = '|';
                if (num && (i >= 1 && i <= width - 1) && j % 2 != 0 && j < mid)
                {
                    map[i][j] = -95;
                    map[i][j + 1] = -10; //打印 ■  ■占2个字节可以拆开来
                    num--;
                }
            }
        }
        gotoxy(0, 0); //容易出现东西卡顿
        for (int i = 0; i <= width; i++)
        {
            for (int j = 0; j <= len; j++)
                printf("%c", map[i][j]);
            printf("\n");
        }
        return n;
    }
    
    void play(int x, int y)
    {
        int turn_0, n = 0, i, j, k, tx, ty, flag = 0;
        if ((x == mid && y == right) || (x == left && y == mid) || (x == left && y == right))
            turn_0 = 0; //往右
        else if ((x == mid && y == left) || (x == right && y == left) || (x == right && y == mid))
            turn_0 = 1; //往左
        for (i = 1, j = y; i <= width; i++)
        { //目的地
            if (map[i][j] != 0)
            {
                tx = i - 1;
                ty = j;
                break;
            }
        }
        for (i = 1, j = x; i <= width; i++)
        { //出发点
            if (map[i][j] != 0)
            {
                break;
            }
        }
        while (1)
        {
            while ((i != 1 || j != x) && (i != 1 || j != y) && (i != tx || j != ty))
            {
                if (turn_0 == 0)
                    for (k = mid - 3; k >= 0; k--)
                    {
                        map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
                        map[i][j + k] = 0;
                    }
                else
                    for (k = 0; k < mid - 2; k++)
                    {
                        map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
                        map[i][j + k] = 0;
                    }
                gotoxy(j, i);
                Sleep(time);
                for (k = 0; k < mid - 2; k++)
                {
                    printf(" ");
                }
                i = i + next[turn[turn_0][n]][0];
                j = j + next[turn[turn_0][n]][1];
                gotoxy(j, i);
                Sleep(time);
                for (k = 0; k < mid - 2; k++)
                {
                    printf("%c", map[i][j + k]);
                }
            }
            n++; //改变方向;
            if (i == tx && j == ty)
                return;
            if (turn_0 == 0)
                for (k = mid - 3; k >= 0; k--)
                {
                    map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
                    map[i][j + k] = 0;
                }
            else
                for (k = 0; k < mid - 2; k++)
                {
                    map[i + next[turn[turn_0][n]][0]][j + next[turn[turn_0][n]][1] + k] = map[i][j + k];
                    map[i][j + k] = 0;
                }
            gotoxy(j, i);
            for (k = 0; k < mid - 2; k++)
            {
                printf(" ");
            }
            Sleep(time);
            i = i + next[turn[turn_0][n]][0];
            j = j + next[turn[turn_0][n]][1];
            gotoxy(j, i);
            for (k = 0; k < mid - 2; k++)
                printf("%c", map[i][j + k]);
            Sleep(time);
        }
    }
    
    void move(int a, int b, int c, char aa, char bb, char cc, int n)
    {
        if (n == 1)
        {
            gotoxy(0, width + 1);
            printf("from %c to %c", aa, cc);
            play(a, c);
            return;
        }
        move(a, c, b, aa, cc, bb, n - 1);
        gotoxy(0, width + 1);
        printf("from %c to %c", aa, cc);
        play(a, c);
        move(b, a, c, bb, aa, cc, n - 1);
        gotoxy(0, width + 1);
    }
    
    int main()
    {
        int n = init();
        move(left, mid, right, 'a', 'b', 'c', n);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: