美文网首页
网易C++--书籍练习案例04--可视化汉诺塔-c/c++ co

网易C++--书籍练习案例04--可视化汉诺塔-c/c++ co

作者: heiqimingren | 来源:发表于2020-11-11 19:31 被阅读0次

    看不明白代码,测试了,发现有点问题

    //#include <tchar.h>        //在程序中使用 #include <tchar.h> 添加对 TCHAR 的支持。
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>    //清屏命令在这里。
    #include <windows.h> //延时10毫秒-sleep,gotoxy函数
    #include <iostream>
    #include <conio.h>       //getch()----不用按回车,就可以输入字符。    
    #include <graphics.h>      //EasyX库,所使用的!
    #include <math.h>         //三角函数
    #include <algorithm>      //max(),min(),和abs(),sort函数排序方法,https://blog.csdn.net/BIGKALA/article/details/81624691,这是方法适用的地址
    #include <ctime>
    
    using namespace std;
    
    
    void move(char x, char y, int n, int **p);
    void hanoi(int n, char one, char two, char three, int **p);
    void changeshuzu(char x, char y, int n, int **p);
    void changehigh(char x, char y); //改变塔高
    void print(int **p);             //输出起始塔
    void printstar(int **p);         //输出*
    void gotoxy(int x, int y);       //将光标移动到(x,y)位置
    static int higha, highb, highc, r, c;
    int main()
    {
        int i;
        int **p;
        printf("input a number:");
        scanf("%d", &r);           //请输入一个数字
        c = r * 10;
        p = new int*[r];            //动态分配二维数组
        p[0] = new int[r*c];
        for (i = 1; i < r;i++)       //动态分配二维数组
        {
            p[i] = p[i - 1] + c;
        }
        higha = r;
        highb = 0;
        highc = 0;
    
        printf("the step to move %d diskes: \n\n ", r);
        printstar(p);
        gotoxy(0, 1);
        getchar();
        hanoi(r, 'A', 'B', 'C', p);
        return 0;
    }
    void hanoi(int n, char one, char two, char three, int **p)
    {
        if (n==1)
        {
            move(one, three, n, p);
        }
        else
        {
            hanoi(n - 1, one, three, two, p);
            move(one, three, n, p);
            hanoi(n - 1, two, one, three, p);
        }
    }
    void move(char x, char y, int n, int **p)  //x:被移柱子,y:得到盘的柱子,n:盘的大小
    {
        getchar();
        printf("%c->%c\n ", x, y);
        changeshuzu(x, y, n, p);        //改变数组
        print(p);
        changehigh(x, y);               //变高
        gotoxy(0, 1);
    }
    void print(int **p)
    {
        int i, j;
        for (i = 0; i < r;i++)
        {
            for (j = 0; j < c;j++)
            {
                if (p[i][j]==1 )
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
        }
    }
    void changehigh(char x, char y)
    {
        switch (x)
        {
            case 'A':higha--; break;
            case 'B':highb--; break;
            case 'C':highc--; break;
        }
        switch (y)
        {
            case 'A':higha++; break;
            case 'B':highb++; break;
            case 'C':highc++; break;
        }
    }
    void changeshuzu(char x, char y, int n, int **p)
    {
        int i, j;
        //m-high为要去掉的行数
        if (x=='A' )
        {
            for (i = 0; i < r;i++)
            {
                for (j = 0; j < c;j++)
                {
                    if (i==r-higha && j>=r-n &&j<=r+n-2 )
                    {
                        p[i][j] = 0;
                    }
                }
            }
        }
        else if (x == 'B')
        { 
            for (i = 0; i < r;i++)
            {
                for (j = 0; j < c;j++)
                {
                    if (i==r-highb && j>3*r-n && j<=3*r+n-2 )
                    {
                        p[i][j] = 0;
                    }
                }
    
            }
        }
        else if (x == 'C')
        {
            for (i = 0; i < r;i++)
            {
                for (j = 0; j < c;j++)
                {
                    if (i == r - highc && j>=5 * r - n && j <= 5 * r + n - 2)
                    {
                        p[i][j] = 0;
                    }
                }
            }
        }
    
        //m-high-1 为要去掉的行数
        if (y=='A' )
        {
            for (i = 0; i < r; i++)
            {
                for (j = 0; j < c; j++)
                {
                    if (i == r - higha-1 && j >= r - n && j <= r + n - 2)
                    {
                        p[i][j] = 1;
                    }
                }
            }
        }
        else if (y == 'B')
        {
            for (i = 0; i < r; i++)
            {
                for (j = 0; j < c; j++)
                {
                    if (i == r - highb-1 && j >= 3 * r - n && j <= 3 * r + n - 2)
                    {
                        p[i][j] = 1;
                    }
                }
            }
        }
        else if (y == 'C')
        {
            for (i = 0; i < r; i++)
            {
                for (j = 0; j < c; j++)
                {
                    if (i == r - highc - 1 && j >= 5 * r - n && j <= 5 * r + n - 2)
                    {
                        p[i][j] = 1;
                    }
                }
            }
        }
    }
    void printstar(int **p)
    {
        int i, j;
        for (i = 0; i < r;i++)
        {
            for (j = 0; j < c;j++)
            {
                if (j >= r - i - 1 && j <=r+i-1)
                {
                    p[i][j] = 1;
                }
            }
        }
        for (i = 0; i < r;i++)
        {
            for (j = 0; j < c;j++)
            {
                if ( p[i][j]==1 )
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }
    void gotoxy(int x, int y)    //将光标移动到(x,y)位置
    {
        CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
        HANDLE hConsoleOut;
        hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
        GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
        csbiInfo.dwCursorPosition.X = x;
        csbiInfo.dwCursorPosition.Y = y;
        SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
    
    }
    
    image.png

    ===========================
    查清楚了一些函数
    https://blog.csdn.net/weixin_30289831/article/details/99138150---c/c++ console(控制台)编程详解

    image.png
    image.png

    相关文章

      网友评论

          本文标题:网易C++--书籍练习案例04--可视化汉诺塔-c/c++ co

          本文链接:https://www.haomeiwen.com/subject/oldybktx.html