• 数据结构 —— 数塔问题


    今日一言:
    不要去学你认为不需要的东西。
    —— 秋山耀平

    数据结构 —— 数塔问题

    咱也不知道写点什么,更新道数据结构题吧。


    C语言

    很少拿C++Java之类的写算法,
    其实也不是因为不会啦,只是压根就不会而已。

    #include "stdio.h"
    #include "stdlib.h"

    #define LEFT 0 // 往左走的标志
    #define RIGHT 1 // 往右走的标志
    #define BACK 2 // 往回走的标志
    // 其实可以回溯迭代,但想想,写都写了,就算了

    #define MAX_LAYER 5 // 层级

    // 存储数塔数据
    int tower[MAX_LAYER][MAX_LAYER] = { {19,7,10,4,16},{2,18,9,5},{10,6,18},{12,15},{9} }; //[layer][index]

    // 下面的逻辑其实很简单,就是用了栈。
    // 当时刚学数据结构的栈,便这么用了。

    typedef struct {
        int index;
        int flag;
    } Elem; // 栈元素类型


    typedef struct {
        Elem* base;
        Elem* top;
        int layer;
    } Stack; // 栈容器类型

    int tempValue = 0;// 缓存值,为全局
    Stack* Tstack; // 操作的栈变量,为全局
    int tempPath[MAX_LAYER]; // 缓存路径

    // 这次的写法缺陷是不能存储所有路径的情况,只会一直存储最佳路径

    void initStack() // 初始化栈
        Tstack = (Stack*)malloc(sizeof(Stack));
        Tstack->base = (Elem*)malloc(sizeof(Elem) * MAX_LAYER);
        if (!Tstack->base) {
            printf("error ");
            exit(0);
        }
        Tstack->top = Tstack->base;
        Tstack->layer = -1;
        printf("初始化完成 ");
    }

    void pushStackByTstack(Stack* Tstack, Elem elem) //压栈   函数名长了点
        Tstack->top++;
        *Tstack->top = elem;
        Tstack->layer++;
        //printf("压入%d : %d : %d ",Tstack->layer,Tstack->top->flag,Tstack->top->index);
        //if( Tstack->layer == MAX_LAYER-1 ) printf("top ");
    }

    void pushStack(Elem elem) // 压栈   函数名就短了
        pushStackByTstack(Tstack, elem);
    }

    Elem popStackByTstack(Stack* Tstack) // 出栈  函数名长了点
        Elem elem = *Tstack->top;
        Tstack->top--;
        Tstack->layer--;
        //printf("取出%d : %d : %d ",Tstack->layer,Tstack->top->flag,Tstack->top->index);
        return elem;
    }

    Elem popStack() // 出栈  函数名就短了
        popStackByTstack(Tstack);
    }

    int getMaxIndexByLayer(int layer) // 获取每层的最大索引
        return MAX_LAYER - layer - 1;
    }

    void GoGoGo(int index) // 核心逻辑程序
        int tempV = 0;

        //压入栈底 
        Elem elemBase;
        elemBase.flag = (index) ? LEFT : RIGHT;
        //printf("flag:%d ",elemBase.flag);
        elemBase.index = index;
        tempV += tower[0][index];
        pushStack(elemBase);

        while (1) {
            // 未达到顶层 
            if (Tstack->top->flag == LEFT) {
                Elem elemLeft;
                //前往左上 
                if (Tstack->layer == MAX_LAYER - 2) elemLeft.flag = BACK;
                else elemLeft.flag = (Tstack->top->index <= 1) ? RIGHT : LEFT;
                elemLeft.index = (Tstack->top->index) ? Tstack->top->index - 1 : 0;
                tempV += tower[Tstack->layer + 1][elemLeft.index];
                pushStack(elemLeft);
            }
            else if (Tstack->top->flag == RIGHT) {
                Elem elemRight;
                //前往右上
                elemRight.index = (Tstack->top->index);
                if (Tstack->layer == MAX_LAYER - 2) elemRight.flag = BACK;
                else elemRight.flag = (Tstack->top->index == getMaxIndexByLayer(Tstack->layer + 1)) ? LEFT : RIGHT;
                Tstack->top->flag = BACK;
                tempV += tower[Tstack->layer + 1][elemRight.index];
                pushStack(elemRight);
            }
            else if (Tstack->top->flag == BACK) {
                // 到达顶层
                if (Tstack->layer == MAX_LAYER - 1) {
                    //printf("tempV:%d ",tempV);
                    if (tempValue < tempV) {
                        // 保存最大值 
                        tempValue = tempV;
                        int i;
                        for (i = 0; i < MAX_LAYER; i++) {
                            tempPath[i] = (*(Tstack->top - i)).index;
                        }
                    }
                }
                tempV -= tower[Tstack->layer][Tstack->top->index];
                popStack();
                if (Tstack->layer == -1break;
                if (Tstack->top->flag == LEFT) {
                    Tstack->top->flag = (Tstack->top->index == getMaxIndexByLayer(Tstack->layer)) ? BACK : RIGHT;
                    //printf("%d->%d->%d ",Tstack->top->index,Tstack->layer,getMaxIndexByLayer(Tstack->layer));
                }
                else if (Tstack->top->flag == RIGHT) {
                    Tstack->top->flag = BACK;
                }
            }
            else {
                printf("error flag is invalid ");
                exit(0);
            }
        }


    }

    //遍历数塔
    void itTheTower() {
        int i;
        initStack();
        for (i = 0; i <= getMaxIndexByLayer(0); i++) {
            //printf("%d! ",i);
            GoGoGo(i);
        }
        printf("The maxValue of all paths: %d ", tempValue);
        printf("path: ");
        for (i = MAX_LAYER - 1; i >= 0; i--) {
            printf("%d", tower[i][tempPath[MAX_LAYER - i - 1]]);
            if (i) printf("->");
            else {
                printf("; ");
            }
        }
    }

    void main() {
        itTheTower();
    }

    运行结果

    初始化完成
    The maxValue of all paths: 63
    path: 9->15->18->5->16;
  • 相关阅读:
    java学习第六天
    java学习第五天
    java学习第四天
    java学习第三天
    java学习第二天
    java学习第一天
    性能测试学习第十三天_性能测试报告编写
    性能测试学习第十二天_性能分析
    性能测试学习第十一天_Analysis
    性能测试学习第十天_controller
  • 原文地址:https://www.cnblogs.com/rcklos/p/13052585.html
Copyright © 2020-2023  润新知