题目背景
一个大小为N*M的城市遭到了X次轰炸,每次都炸了一个每条边都与边界平行的矩形。
题目描述
在轰炸后,有Y个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮。
输入格式
第一行,四个整数:n、m、x、y。
以下x行,每行四个整数:x1、y1、x2、y2,表示被轰炸的矩形的左上角坐标和右下角坐标(比如1 3 7 10就表示被轰炸的地方是从(1,3)到(7,10)的矩形)。
再以下y行,每行两个整数,表示这个关键点的坐标。
输出格式
共y行,
每行第一个字符为Y或N,表示是否被轰炸,若为Y,在一个空格后为两个整数,表示被炸了几次和最后一次是第几轮。
输入输出样例
输入 #1复制
10 10 2 3 1 1 5 5 5 5 10 10 3 2 5 5 7 1
输出 #1复制
Y 1 1 Y 2 2 N
说明/提示
数据很弱!!!直接模拟!!!!
1<=N,M<=100
方法一:暴力,散列表的形式,耗费较多物理资源和时间资源。。
#include<bits/stdc++.h>
using namespace std;
int a[102][102]; //记录被轰炸的次数
int b[102][102]; //记录第几次被轰炸
int main(){
int n,m,x,y;
int x1,y1,x2,y2;
cin>>n>>m>>x>>y;
int count=0;//第几次被轰炸
for(int i=0;i<x;i++){
cin>>x1>>y1>>x2>>y2;
count++;
for(int t=x1;t<=x2;t++){
for(int j=y1;j<=y2;j++){
a[t][j]++;
b[t][j]=count;
}
}
}
int h,z;
for(int i=0;i<y;i++){
cin>>h>>z;
if(a[h][z]!=0){
cout<<"Y "<<a[h][z]<<" "<<b[h][z]<<endl;
}else{
cout<<"N";
}
}
return 0;
}
方法二:特别注意:#include<bits/stdc++.h> 中不能定义y1,y1[ ],因为y1在此头文件中是一个函数!
#include<bits/stdc++.h>
using namespace std;
const int size=10002;
int x1[size],y11[size],x2[size],y2[size];
int main(){
int n,m,x,y,a,b;
cin>>n>>m>>x>>y;
for(int i=0;i<x;i++){
cin>>x1[i]>>y11[i]>>x2[i]>>y2[i];
}
int count=0,last=0;
for(int i=0;i<y;i++){
cin>>a>>b;
count=0;
for(int j=0;j<x;j++){
if(a>=x1[j]&&a<=x2[j]&&b>=y11[j]&&b<=y2[j]){
count++;
last=j;
}
}
if(count==0){
cout<<"N"<<endl;
}else{
cout<<"Y "<<count<<" "<<++last<<endl;
}
}
return 0;
}