2025年里程碑:阶跃星辰开源Step1X-3D框架 引爆单图3D资产生成革命
2026/11/4 6:33:28
本题模拟了一个简单的窗口系统,需要处理鼠标点击事件,根据点击位置确定选中的区域(Region \texttt{Region}Region)或图标(Icon \texttt{Icon}Icon)。
关键规则:
'A'、'B'、…,图标按输入顺序编号为1、2、…。输入格式:
I表示图标,后跟其中心坐标( x , y ) (x, y)(x,y)。R表示区域,后跟左上角( x 1 , y 1 ) (x_1, y_1)(x1,y1)和右下角( x 2 , y 2 ) (x_2, y_2)(x2,y2)坐标。M表示鼠标点击,后跟点击坐标( x , y ) (x, y)(x,y)。M之后不会再出现I或R。#结束。输出格式:
数据结构设计
处理流程
I和R数据,分别存入向量中。M时:注意事项
// Mouse Clicks// UVa ID: 142// Verdict: Accepted// Submission Date: 2016-01-21// UVa Run Time: 0.012s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structicon{intleftX,topY;intlabel;intdistance;intvisible;};structregion{intleftX,topY,rightX,bottomY;charlabel;};// 图标排序比较规则booloperator<(consticon&a,consticon&b){if(a.visible==b.visible){if(a.distance==b.distance)returna.label<b.label;elsereturna.distance<b.distance;}elsereturna.visible>b.visible;}intmain(){string line;string category;intleftX,topY,rightX,bottomY;vector<icon>icons;vector<region>regions;intindexI=1,indexR=1;while(getline(cin,line),line!="#"){istringstreamiss(line);iss>>category>>leftX>>topY;if(line.find('I')!=line.npos){icons.push_back((icon){leftX,topY,indexI++,0,0});}elseif(line.find('R')!=line.npos){iss>>rightX>>bottomY;regions.push_back((region){leftX,topY,rightX,bottomY,('A'+indexR++-1)});}else{// 检查鼠标事件是否落在矩形内boolinRegion=false;for(inti=regions.size()-1;i>=0;i--){region r=regions[i];if(leftX>=r.leftX&&leftX<=r.rightX&&topY>=r.topY&&topY<=r.bottomY){cout<<r.label<<endl;inRegion=true;break;}}// 落在矩形内,不需处理后续图标if(inRegion)continue;// 计算鼠标和图标的距离for(inti=0;i<icons.size();i++)icons[i].distance=pow(icons[i].leftX-leftX,2)+pow(icons[i].topY-topY,2);// 设置图标可见性for(inti=0;i<icons.size();i++){icons[i].visible=1;for(intj=0;j<regions.size();j++){region r=regions[j];if(icons[i].leftX>=r.leftX&&icons[i].leftX<=r.rightX&&icons[i].topY>=r.topY&&icons[i].topY<=r.bottomY){icons[i].visible=0;break;}}}// 排序sort(icons.begin(),icons.end());// 按要求输出图标序号for(inti=0;i<icons.size();i++)if(icons[i].distance==icons[0].distance&&icons[i].visible)cout<<setw(3)<<right<<icons[i].label;elsebreak;cout<<'\n';}}return0;}