数据结构 —— 数塔问题
Posted rcklos
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 —— 数塔问题相关的知识,希望对你有一定的参考价值。
今日一言:
不要去学你认为不需要的东西。
—— 秋山耀平
数据结构 —— 数塔问题
咱也不知道写点什么,更新道数据结构题吧。
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 == -1) break;
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;
以上是关于数据结构 —— 数塔问题的主要内容,如果未能解决你的问题,请参考以下文章