【解题思路】
① 糖块种类的数据量不是很大,可用二维数组保存糖块的粘合数据;
② 循环处理糖块粘合情况即可。
【1】糖块粘合数据的保存
① 用 a[100][3] 来储存糖块的粘合数据不便于后续查找,因为每次都要用一个for循环来查找,代码效率很低;
② 由于糖块种类小于1000,数据量不大,建议用 a[1000][1000] 来储存粘合数据:
scanf("%d%d%d",&x,&y,&z); a[x][y]=a[y][x]=z; // 表示糖类x和糖类y可以粘合成糖类z
【2】循环判断糖块能否粘合
① 用 b[] 来储存依次输入的糖类,x记录数组下标:
scanf("%d",&n); x=-1; while(n--) scanf("%d",&b[++x]);
② 循环判断 b[x] 和 b[x-1] 能否粘合成新的糖块,直到不能粘合为止:
while(x>0) { if(a[b[x]][b[x-1]]==0) // 若不能粘合,则不再处理 break; b[x-1]=a[b[x]][b[x-1]]; // 若能粘合,则用b[x-1]储存粘合后的糖类,x减1 x--; }
【注意事项】
① 若要开很大的数组,可使用全局数组。
【参考代码】
#include<stdio.h> int a[1001][1001]={0},b[100000],n,x,y,z; int main(void) { scanf("%d%d",&n,&n); // 糖的种类在这里用不上,直接覆盖输入了 while(n--) { scanf("%d%d%d",&x,&y,&z); a[x][y]=a[y][x]=z; // 糖类x和糖类y可以粘合成糖类z } scanf("%d",&n); x=-1; while(n--) { scanf("%d",&b[++x]); // 输入n个糖类 while(x>0) { if(a[b[x]][b[x-1]]==0) // 若不能粘合了,跳出循环 break; b[x-1]=a[b[x]][b[x-1]]; // 若可以粘合,变成新糖后x减1 x--; } } for(y=0;y<=x;y++) printf("%d ",b[y]); return 0; }
0.0分
14 人评分
C语言训练-阶乘和数* (C语言代码)浏览:1060 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:575 |
简单的a+b (C语言代码)浏览:685 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C++代码)(手动优化一下计算)浏览:1365 |
C二级辅导-统计字符 (C语言代码)浏览:528 |
P1002 (C语言代码)浏览:1019 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:1485 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:998 |
printf基础练习2 (C语言代码)浏览:955 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:716 |