DotcppXF


私信TA

用户名:dotcpp0599925

访问量:2121

签 名:

层楼终究误少年

等  级
排  名 151
经  验 6163
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业 计算机科学与技术

  自我简介:

The sad truth is, not everyone will accomplish something great. Some of us may just have to find meaning in the little moments that make up life.


【解题思路】


        ① 糖块种类的数据量不是很大,可用二维数组保存糖块的粘合数据;

        ② 循环处理糖块粘合情况即可。



【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 人评分

  评论区