CCF 201403-2 窗口 c语言代码(100分&&30分),为何错了?

1.100分代码

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int x1;
    int y1;
    int x2;
    int y2;
    int num;//输入时的编号
}Lnode;
int main()
{
    int N,M,i,j,x,y,count=0,k,flag=0;
    scanf("%d",&N);
    scanf("%d",&M);
    Lnode lnode[N];//其中每一项的num编号代表输入时的编号,即窗口的编号。而在数组中的顺序代表窗口的由下到上的顺序
    Lnode lnodee;//用来记录被点击的窗口
    int fruit[M];//输出结果数组,初始为0。最后输出时若为0则输出IGNORED
    for(i=0;i<M;i++)
        fruit[i]=0;
    for(i=0;i<N;i++)//N个窗口
    {
        scanf("%d",&lnode[i].x1);
        scanf("%d",&lnode[i].y1);
        scanf("%d",&lnode[i].x2);
        scanf("%d",&lnode[i].y2);
        lnode[i].num=i+1;
    }
    for(k=0;k<M;k++)//M次点击
    {
        flag=0;
        scanf("%d",&x);
        scanf("%d",&y);
        for(i=N-1;i>=0;i--)//从最上层开始检验
        {
            if((x>=lnode[i].x1&&x<=lnode[i].x2)&&(y>=lnode[i].y1&&y<=lnode[i].y2))
            {
                printf("%d\n",lnode[i].num);
                if(i!=N-1)//若点击到的这个窗口不是最最上面的窗口(即第一层),则将该层上面的窗口依次下移,把该层放在最上面
                {
                    lnodee=lnode[i];
                    for(j=i;j<=N-2;j++)
                    {
                        lnode[j]=lnode[j+1];
                    }
                    lnode[N-1]=lnodee;
                }
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            printf("IGNORED\n");
        }
    }
    return 0;
}

2.30分代码:关键代码没变,主要修改了一下输出的部分的代码。将结果放入一个数组中统一最后输出,然后就错了。为何?

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int x1;
    int y1;
    int x2;
    int y2;
    int num;//输入时的编号
}Lnode;
int main()
{
    int N,M,i,j,x,y,count=0,k;
    scanf("%d",&N);
    scanf("%d",&M);
    Lnode lnode[N];//其中每一项的num编号代表输入时的编号,即窗口的编号。而在数组中的顺序代表窗口的由下到上的顺序
    Lnode lnodee;//用来记录被点击的窗口
    int fruit[M];//输出结果数组,初始为0。最后输出时若为0则输出IGNORED
    for(i=0;i<N;i++)//N个窗口
    {
        scanf("%d",&lnode[i].x1);
        scanf("%d",&lnode[i].y1);
        scanf("%d",&lnode[i].x2);
        scanf("%d",&lnode[i].y2);
        lnode[i].num=i+1;
    }
    for(i=0;i<M;i++)
        fruit[i]=0;
    for(k=0;k<M;k++)//M次点击
    {
        scanf("%d",&x);
        scanf("%d",&y);
        for(i=N-1;i>=0;i--)//从最上层开始检验
        {
            if((x>=lnode[i].x1&&x<=lnode[i].x2)&&(y>=lnode[i].y1&&y<=lnode[i].y2))
            {
                fruit[count++]=lnode[i].num;//将点击到的最上层的窗口的编号存入结果数组
                if(i!=N-1)//若点击到的这个窗口不是最最上面的窗口(即第一层),则将该层上面的窗口依次下移,把该层放在最上面
                {
                    lnodee=lnode[i];
                    for(j=i;j<=N-2;j++)
                    {
                        lnode[j]=lnode[j+1];
                    }
                    lnode[N-1]=lnodee;
                }
                break;
            }
        }
    }
    for(i=0;i<M;i++)//结果表的输出
    {
        if(i!=M-1)
        {
            if(fruit[i]!=0)
            {
                printf("%d\n",fruit[i]);
            }else
                printf("IGNORED\n");
        }else{
            if(fruit[i]!=0)
            {
                printf("%d",fruit[i]);
            }else
                printf("IGNORED");
        }

    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值