北航计算机机试15窗口点击模拟
明天出发!
【题意】
在计算机屏幕上,有 N 个窗口。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,
在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你用鼠标点击某个点
的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会
被移到所有窗口的顶层,而剩余的窗口的层次顺序不变,如果你点击的位置不属于任何窗口
计算机就会忽略你这次点击。编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的
个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高),然后
3
读入点击的次数和位置(以点击的坐标表示),编写程序求得经过上述点击后的窗口叠放次序。
【假设】:
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
标准输入
4 2 3 1
思路 :窗口模拟点击实质则是几个矩阵的范围比较
首先判断当前点击坐标在哪几个窗口中(具体实现:判断坐标是否被矩形坐标包含)
再判断当前这几个矩阵的等级谁最大,也就是层级最小
- 关于层级这个我来解释一下,– 再一次没有读懂我航的题目,先输入的窗口层次越高,就表示这个窗口越底层,就比如最上面的窗口的层次为1
将所有比等级最大的窗口的层级值小的窗口的层级值+1,并将该窗口的层级值设为1
结果是最有意思的哈哈哈哈哈
直接按顺序输出每行的第一个元素就恰好是要得到的答案
试了几个,不是凑巧啊,是真的啊
比如:
0在第4个
1在第2个
2在第3个
3在第1个
输出就是 :4,2,3,1
恰好是第一个元素的值
大神求解答为什么哈哈哈哈哈哈
#include<stdio.h>
int main()
{
int poi[10][5];
int che[20][2];
int n,m,top_win,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&poi[i][j]);//数组输入加&&&&&&
}
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&che[i][0],&che[i][1]);
}
///先输入的层次高,也就是等级越低
/// 先输入的坐标越小,坐标越小,等级越低,
for(i=0;i<m;i++)
{
top_win=0;
for(j=0;j<n;j++)
{
if(che[i][0]>=poi[j][1] && che[i][0]<=poi[j][3] && che[i][1]>=poi[j][2] && che[i][1]<=poi[j][4])
{
//说明在这个窗户里
if(poi[j][0]>top_win) top_win=j;
}
}//最后就是j是最上面的那个窗户
if(top_win!=0)
{
for(j=0;j<n;j++)
{
if(j!=top_win&&poi[j][0]<poi[top_win][0])
{
poi[j][0]+=1;
}
}
poi[top_win][0]=1;
}
}
///////////////////////
for(i=0;i<n;i++)
{
printf("%d ",poi[i][0]);
}
printf("\n");
//////////clear
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
poi[i][j]=0;
}
}
for(i=0;i<m;i++)
{
che[i][0]=0;
che[i][1]=0;
}
}
return 0;
}