P1003 铺地毯

P1003 铺地毯<<点击查看题目=w=

本来想的是扫一遍,然后完美爆掉了内存

原代码:

#include<bits/stdc++.h>
#define MAXN 10005
using namespace std;

int n,x,y;
int ans[MAXN][MAXN];
struct ditan
{
    int a,b,g,k;
}di[MAXN];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>di[i].a >>di[i].b >>di[i].g >>di[i].k ;
    cin>>x>>y;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=di[i].g ;j++)
            for(int l=0;l<=di[i].k ;l++)
                ans[di[i].a +j][di[i].b +l]=i;
    if(ans[x][y])
        cout<<ans[x][y]<<endl;
    else
        cout<<"-1"<<endl;
    return 0;
}

好的可以开始重新写了

那我不开这个二维数组就行了= =直接拿坐标来存。

先写个函数判断目标点是否被地毯覆盖

int qujian(int a,int b,int c )//b<=c
{
    if(a>=b&&a<=c)    return 1;
    else return 0;
}

然后从后往前判断目标点是否被地毯覆盖;

#include<bits/stdc++.h>
#define MAXN 10005
using namespace std;

int n,x,y;
int qujian(int a,int b,int c )//b<=c
{
    if(a>=b&&a<=c)    return 1;
    else return 0;
}
struct dtt
{
    int a,b,g,k;
}dt[MAXN];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>dt[i].a >>dt[i].b >>dt[i].g >>dt[i].k ;
    cin>>x>>y;
    int i;
    for( i=n;i>=1;i--)
        if(qujian(x,dt[i].a ,dt[i].a +dt[i].g )&&qujian(y,dt[i].b,dt[i].k +dt[i].b )) break;
            
    if(i) 
        cout<<i<<endl;
    else
        cout<<"-1"<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/lizinuo/p/9455070.html