c语言出错了,可以看看吗?

题目描述
现有一个长宽高分别为 w,x,h 组成的实心玻璃立方体,可以认为是由 1×1×1 的数个小方块组成的,每个小方块都有一个坐标 (i,j,k)。现在需要进行 q 次切割。每次切割给出 (x1,y1,z1),(x2,y2,z2).每次切割时,使用激光工具切出一个立方体空洞,空洞的壁平行于立方体的面,空洞的对角点就是给出的切割参数的两个点。换句话说,所有满足 4×4×4 的大方块,其体积为 64;给出参数 (1,1,1),(2,2,2) 时,中间的 8 块小方块就会被蒸发,剩下 56 个小方块。现在想知道经过所有切割操作后,剩下的工艺品还剩下多少格小方块的体积?
输入格式
第一行三个正整数 w,x,h。第二行一个正整数 q。接下来 q 行,每行六个整数
输出格式
输出一个整数表示答案。


#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a,b,c,q;
    scanf("%d %d %d\n",&a,&b,&c);
    scanf("%d",&q);
    int x[6][100],k[20][20][20];
    for(int i=0;i<6;i++)
    {
        for(int j=0;j<q;j++)
        {
            scanf("%d",&x[i][j]);
        }
    }
    for(int d=0;d<a;d++)
    {
        for(int e=0;e<b;e++)
        {
            for(int f=0;f<c;f++)
            {
                k[d][e][f]=0;
            }
        }
    }
    for(int j=0;j<q;j++)
    {
        for(int d=x[0][j];d<=x[4][j];d++)
        {
           for(int e=x[1][j];e<=x[5][j];e++)
           {
               for(int f=x[2][j];f<=x[6][j];f++)
               {
                   k[d][e][f]=1;
               }
           }
        }
    }
    int count=0;
    for(int d=0;d<a;d++)
    {
        for(int e=0;e<b;e++)
        {
            for(int f=0;f<c;f++)
            {
                if(k[d][e][f]=1)
                {
                    count++;
                }
            }
        }
    }
    int ans=a*b*c-count;
    printf("%d",ans);
    return 0;
}
回复讨论

//题目描述
//现有一个长宽高分别为 w,x,h 组成的实心玻璃立方体,可以认为是由 1×1×1 的数个小方块组成的,
//每个小方块都有一个坐标 (i,j,k)。现在需要进行 q 次切割。每次切割给出 (x1,y1,z1),(x2,y2,z2).
//每次切割时,使用激光工具切出一个立方体空洞,空洞的壁平行于立方体的面,空洞的对角点就是给出的切割参数的两个点。
//换句话说,所有满足 4×4×4 的大方块,其体积为 64;给出参数 (1,1,1),(2,2,2) 时,中间的 8 块小方块就会被蒸发,剩下 56 个小方块。
//现在想知道经过所有切割操作后,剩下的工艺品还剩下多少格小方块的体积?
//输入格式
//第一行三个正整数 w,x,h。第二行一个正整数 q。接下来 q 行,每行六个整数
//输出格式
//输出一个整数表示答案。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{
    int a,b,c,q;
    static int x[6][100],k[100][100][100];
    scanf("%d%d%d",&a,&b,&c);
    assert(0<a && a<100
        && 0<b && b<100
        && 0<c && c<100);
    scanf("%d",&q);
    assert(0<q && q<100);
    for(int j=0;j<q;j++)
    {
        for(int i=0;i<6;i++)
        {
            scanf("%d",&x[i][j]);
        }
    }
    for(int d=0;d<a;d++)
    {
        for(int e=0;e<b;e++)
        {
            for(int f=0;f<c;f++)
            {
                k[d][e][f]=0;
            }
        }
    }
    for(int j=0;j<q;j++)
    {
        assert(x[0][j]<=x[3][j]);
        for(int d=x[0][j];d<=x[3][j];d++)
        {
           assert(x[1][j]<=x[4][j]);
           for(int e=x[1][j];e<=x[4][j];e++)
           {
               assert(x[2][j]<=x[5][j]);
               for(int f=x[2][j];f<=x[5][j];f++)
               {
                   k[d][e][f]=1;
               }
           }
        }
    }
    int count=0;
    for(int d=0;d<a;d++)
    {
        for(int e=0;e<b;e++)
        {
            for(int f=0;f<c;f++)
            {
                if(k[d][e][f]==1)
                {
                    count++;
                }
            }
        }
    }
    int ans=a*b*c-count;
    printf("%d\n",ans);
    return 0;
}


【以下回答由 GPT 生成】

我会尽力帮你解决问题。在检查代码时,我发现了可能导致错误的几个地方,并提供了相应的修复方案。

修复方案如下:

  1. 在第7行的int x[6][100]定义中,由于第二维的大小是100,而你的输入循环中仅使用了q次迭代,所以请将100更改为q,即int x[6][q]
int x[6][q];
  1. 在第22行的第三个for循环中,将k[d][e][f]的赋值改为k[f][e][d],因为你在输入x数组时已经将坐标重新排列。
k[f][e][d] = 1;
  1. 在第31行的第三个for循环中,将条件f<c改为f<d,因为立方体的维度应该是d、e和f。
for(int f=0; f<d; f++){
  1. 在第39行的for循环结束后,你需要在输出结果之前添加一个换行符。
printf("%d\n", ans);

修复后的代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a, b, c, q;
    scanf("%d %d %d\n", &a, &b, &c);
    scanf("%d", &q);
    int x[6][q], k[20][20][20];

    for(int i=0; i<6; i++){
        for(int j=0; j<q; j++){
            scanf("%d", &x[i][j]);
        }
    }

    for(int d=0; d<a; d++){
        for(int e=0; e<b; e++){
            for(int f=0; f<d; f++){
                k[f][e][d] = 0;
            }
        }
    }

    for(int j=0; j<q; j++){
        for(int d=x[0][j]; d<=x[4][j]; d++){
            for(int e=x[1][j]; e<=x[5][j]; e++){
                for(int f=x[2][j]; f<=x[6][j]; f++){
                    k[f][e][d] = 1;
                }
            }
        }
    }

    int count = 0;
    for(int d=0; d<a; d++){
        for(int e=0; e<b; e++){
            for(int f=0; f<d; f++){
                if(k[f][e][d] == 1){
                    count++;
                }
            }
        }
    }

    int ans = a*b*c - count;
    printf("%d\n", ans);

    return 0;
}

希望这些修复方案能够解决你的问题。



【相关推荐】


  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7621786
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^