原题链接:糖块粘合
解题思路:
使用一个数组作为顺序栈,将输入的糖果与栈顶元素进行比较,是否存在该种组合,不存在则元素入栈,存在则更新糖果为组合数,然后继续与栈顶元素比较。
注意事项:
参考代码:
#include <stdio.h>
int findCombination(int comb[][3], int m, int x1, int x2) {
int find = -1;
for (int j = 0; j < m; j++) {
if ((comb[j][0] == x1 && comb[j][1] == x2)
|| (comb[j][0] == x2 && comb[j][1] == x1)) {
find = j;
break;
}
}
return find;
}
int main() {
// 输入n,m
int n, m;
scanf("%d %d", &n, &m);
// 输入m种组合
int comb[m][3];
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &comb[i][0], &comb[i][1], &comb[i][2]);
}
// 获取糖果数
int k;
scanf("%d", &k);
int stack[k]; // 栈数组
int top = -1; // 栈顶元素指针
int candy;
for (int i = 0; i < k; i++) {
scanf("%d", &candy); // 获取输入的糖果
if (top == -1) { // 栈空,元素直接入栈
stack[++top] = candy;
} else {
while (top > -1) { // 栈非空
int x1 = stack[top]; // 获取栈顶元素
int x2 = candy;
int find = findCombination(comb, m, x1, x2); // 根据x1,x2从组合中查找
if (find < 0) { // 不存在x1,x2的组合
break;
} else {
top--; // 弹出栈顶元素
candy = comb[find][2]; // 更新组合数
}
}
stack[++top] = candy; // 没有与之匹配的栈顶元素,入栈
}
}
// 依次输出栈中元素
for (int i = 0; i <= top; i++) {
printf("%d ", stack[i]);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复