飞雪之都 2022-03-11 00:14 采纳率: 100%
浏览 47
已结题

acm提交平台交不上去,显示错误但自己测试没问题

问题遇到的现象和发生背景 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;

输入格式
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);

输出格式
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽

问题相关代码,请勿粘贴截图 #include<stdio.h>

define N 1000

typedef struct
{
int number;
int x;
int y;
}rectangle;
void paixv(rectangle *b,int n);
void del(rectangle *a,int n);
int main()
{
int n;
int k;
int c;
rectangle a[N];
scanf("%d",&n);
scanf("%d",&k);
while(n--)
{

    for(int j=0;j<k;j++)
    {
        scanf("%d%d%d",&a[j].number,&a[j].x,&a[j].y);
    }
    for(c=0;c<k;c++)
    {
        int t;
        if(a[c].x<a[c].y)
        {
            t=a[c].y;
            a[c].y=a[c].x;
            a[c].x=t;
        }
        
    }
    paixv(a,k);
    del(a,k);
    for(int m=0;m<k;m++)
    {
        if(a[m].number==a[m+1].number&&a[m].x==a[m+1].x&&a[m].y==a[m+1].y)
        {
            printf("%d %d %d",a[m].number,a[m].x,a[m].y);//del完最后会有重复的这里判断到重复时停止输出。
            printf("\n");
            break;
        
        }
    
    
        printf("%d %d %d",a[m].number,a[m].x,a[m].y);
        printf("\n");
    }
        
}
    return 0;

}
void paixv(rectangle *b,int n)//这是排序
{
int i,j;
rectangle c;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if((b[i].number>b[j].number)||(b[i].number==b[j].number&&b[i].x>b[j].x)||(b[i].number
==b[j].number&&b[i].x==b[j].x&&b[i].y>b[j].y))
{
c=b[j];
b[j]=b[i];
b[i]=c;
}
}
}

}
void del(rectangle *a,int n)//这里是先找相同的两条数据,如果找到相同的两组数据依次将相同的数据以下的数据向上移。
{
int i;
for(i=0;i<n-1;i++)
{
if(a[i].number==a[i+1].number&&a[i].x==a[i+1].x&&a[i].y==a[i+1].y)
{

    for(int k=i+1;k<n-1;k++)
    {
        
        a[k]=a[k+1];
    }
}
}

}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 关注

    scanf("%d", &k); 应该放在 while 循环体中
    n>1时,每一组的第一行都要重新读取一个整数,表示这一组长方形的个数

    #include <stdio.h>
    #define N 1000
    typedef struct
    {
        int number;
        int x;
        int y;
    } rectangle;
    void paixv(rectangle *b, int n);
    void del(rectangle *a, int n);
    int main()
    {
        int n;
        int k;
        int c;
        rectangle a[N];
        scanf("%d", &n);
        while (n--)
        {
            scanf("%d", &k); //放在 while 循环体中
            for (int j = 0; j < k; j++)
            {
                scanf("%d%d%d", &a[j].number, &a[j].x, &a[j].y);
            }
            for (c = 0; c < k; c++)
            {
                int t;
                if (a[c].x < a[c].y)
                {
                    t = a[c].y;
                    a[c].y = a[c].x;
                    a[c].x = t;
                }
            }
            paixv(a, k);
            del(a, k);
            for (int m = 0; m < k; m++)
            {
                if (a[m].number == a[m + 1].number && a[m].x == a[m + 1].x && a[m].y == a[m + 1].y)
                {
                    printf("%d %d %d", a[m].number, a[m].x, a[m].y); //del完最后会有重复的这里判断到重复时停止输出。
                    printf("\n");
                    break;
                }
    
                printf("%d %d %d", a[m].number, a[m].x, a[m].y);
                printf("\n");
            }
        }
        return 0;
    }
    void paixv(rectangle *b, int n) //这是排序
    {
        int i, j;
        rectangle c;
        for (i = 0; i < n; i++)
        {
            for (j = i + 1; j < n; j++)
            {
                if ((b[i].number > b[j].number) || (b[i].number == b[j].number && b[i].x > b[j].x) || (b[i].number == b[j].number && b[i].x == b[j].x && b[i].y > b[j].y))
                {
                    c = b[j];
                    b[j] = b[i];
                    b[i] = c;
                }
            }
        }
    }
    void del(rectangle *a, int n) //这里是先找相同的两条数据,如果找到相同的两组数据依次将相同的数据以下的数据向上移。
    {
        int i;
        for (i = 0; i < n - 1; i++)
        {
            if (a[i].number == a[i + 1].number && a[i].x == a[i + 1].x && a[i].y == a[i + 1].y)
            {
    
                for (int k = i + 1; k < n - 1; k++)
                {
    
                    a[k] = a[k + 1];
                }
            }
        }
    }
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 利用pthon计算薄膜结构的光导纳
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU