问题描述
试题编号: | 201403-2 |
试题名称: | 窗口 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。 输入格式 输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10) 输出格式 输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。 样例输入 3 4 样例输出 2 样例说明 第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。 |
纠结了很久的c++二维动态数组的定义和使用,很多博客写的内容蛮多但是在查找替换某一个元素的具体使用的代码上并没有详细的做法以供参考。
后面还是转用vector,对于它的push_back()和pop_back用法,还有其他一些函数调用还要进一步学习。(做了三天终于100啦~在找看其他更好的解法。)
代码:
#include "iostream"
#include "vector"
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int column1=4;
int columu2=2;
vector<vector<int> > a(n,vector<int>(column1));//存储窗口的坐标位置
vector<vector<int> > b(m,vector<int>(columu2));//储存点击的点的坐标位置
vector<vector<int> > c(n,vector<int>(column1));//用于对比返回窗口编号
for(int i = 0;i < n;i++){
for(int j = 0;j< 4;j++)
cin>>a[i][j];
}//输入窗口的坐标位置
for(int i = 0;i < m;i++){
for(int j = 0;j< 2;j++)
cin>>b[i][j];
}//输入点击的点的坐标位置
c=a;
//以点击点的个数作为循环次数,依次判断每个点击点对应的窗口
for (int i = 0; i <m ; i++) {
int show=-1;
//从顶层窗口开始依次向下比较
for (int j = n - 1; j >= 0; j--) {
//判断点击的点是否在窗口内
if (b[i][0] <= a[j][2] && b[i][0] >= a[j][0] && b[i][1] <= a[j][3] && b[i][1] >= a[j][1]) {
show = j + 1;
//将被点击的窗口添加到最顶层
a.push_back(a[show - 1]);
//被点击的窗口以上的窗口依次下降一个位置
for (int i = show - 1; i < n; i++) {
a[i] = a[i + 1];
}
//删除刚刚添加的重复的被点击窗口
a.pop_back();
break;
}
}
if(show==-1){
cout<<"IGNORED"<<endl;
} else {
//找到对应窗口的序号并返回
for (int j = 0; j < n; j++) {
if (c[j] == a[n - 1])
show = j + 1;
}
cout << show << endl;
}
}
return 0;
}