这是本人重新开始使用Visual C++ 6.0写出的第一个程序
【题意】在计算机屏幕上,有 N 个窗口。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你用鼠标点击某个点的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会被移到所有窗口的顶层,而剩余的窗口的层次顺序不变,如果你点击的位置不属于任何窗口计算机就会忽略你这次点击。编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高),然后读入点击的次数和位置(以点击的坐标表示),编写程序求得经过上述点击后的窗口叠放次序。
【假设】:
1、 屏幕左下角作为 X 轴和 Y 轴坐标原点,即坐标为(0,0),所有输入的坐标 数值都是整数,并且都大于等于 0,小于等于1000。
2、 输出窗口的叠放次序时从最后点击后最顶层的窗口编号开始按层次依次输出;
3、 输入的窗口个数大于 0 并且小于等于 10,点击次数大于 0并且小于等于 20。
【输入】第一行窗口个数 n,接下来 n 行每行一个窗口的编号、左下角坐标、右上角坐标。
接下来一行点击次数 k,接下来 k行每行一个点击坐标。
【输出】一行 n个数字,表示 K 次点击后按层次排列的窗口编号,空格隔开。
行末空格与文末换行可有可无。
样例:
【标准输入】4
1 43 31 70 56
2 50 24 80 50
3 23 13 63 42
4 57 36 90 52
5
47 28
73 40
68 32
82 43
27 49
【标准输出】
4 2 3 1
思路:
用二维数组screen来存储窗口的id,点击某一个位置时,从screen得到该位置的窗口ID,然后将其置顶即可
(不用screen数组存储也可以,遇到点击事件时从最顶端的窗口开始逐个判断光标是否在本窗口内)
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;
struct Window {
int id;
int x1, y1;
int x2, y2;
} windows[10];
vector<int> seqs; // window sequence, seqs[0] is the bottom
int screen[1000][1000]; // window id of each pixel in screen, -1 mean no window
int main() {
freopen("C:\\input1.txt", "r", stdin);
int i, j, k;
int window_count;
int click_count;
scanf("%d", &window_count);
memset(screen, -1, sizeof(screen));
for (i = 0; i < window_count; i++) {
scanf("%d %d %d %d %d", &windows[i].id, &windows[i].x1, &windows[i].y1, &windows[i].x2, &windows[i].y2);
}
// put all windows on screen
for (k = window_count - 1; k >= 0; k--) {
seqs.push_back(k);
for (i = windows[k].x1; i <= windows[k].x2; i++) {
for (j = windows[k].y1; j <= windows[k].y2; j++) {
screen[i][j] = windows[k].id;
}
}
}
scanf("%d", &click_count);
// read clicks
int click_x, click_y;
for (int f = 0; f < click_count; f++) {
scanf("%d %d", &click_x, &click_y);
if (screen[click_x][click_y] == -1) continue;
// find the window in array
for (j = 0; j < window_count; j++) {
if (windows[j].id == screen[click_x][click_y]) {
k = j;
break;
}
}
for (i = windows[k].x1; i <= windows[k].x2; i++) {
for (j = windows[k].y1; j <= windows[k].y2; j++) {
screen[i][j] = windows[k].id;
}
}
// bring the window to top
for (j = 0; j < seqs.size(); j++) {
if (seqs[j] == k) {
seqs.erase(seqs.begin() + j);
seqs.push_back(k);
break;
}
}
}
for (i = seqs.size() - 1; i >= 0; i--) {
printf("%d ", windows[seqs[i]].id);
}
return 0;
}