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; }