昨天晚上搞了通宵,没成功,结果还是差了一些,是在是头晕脑胀,参看源代码,这题的数据结构设计比较巧妙。 // A Less Simple Task in Windows.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<fstream> using namespace std; const int MAX_N=5 ; //窗口的最大数目 const int MAX_M=30; //鼠标单击次数最大值 int N,M; //窗口数和鼠标单击次数 int H,Wmax,Hmax;//标题栏高度,窗口最大化的宽度和高度 int owins[MAX_N][4];//初始时刻各窗口状态(owins[i][0],owins[i][1])和(owins[i][2],owins[i][3])分别为第i个窗口左上角和右下角坐标 int cwins[MAX_N][6];//每次单击鼠标后各窗口的状态(cwins[j][0],cwins[j][1]) //和(cwins[j][2],cwins[j][3])分别为第j个窗口的左上角和右下角坐标; //cwins[j][4]为当前第j个窗口在owins中的索引 //cwins[j][5]为当前第j个窗口是否最大化标记,1是0否 int res[MAX_M];//结果 int x,y,lx,ly; //(x,y)和(lx,ly)分别为当前和上一次单击鼠标时鼠标位置坐标 int notDclickTitle ;//是否一定不是双击窗口标题栏 1是0否 int _tmain(int argc, _TCHAR* argv[]) { ifstream cin("d://1.txt"); int i,j,k,h; notDclickTitle=1; lx=ly=-1; while(cin>>N>>H>>Wmax>>Hmax){ for(i=0;i<N;i++){ //初始化窗口信息 for(j=0;j<4;j++){ cin>>owins[i][j]; cwins[i][j]=owins[i][j]; } cwins[i][4]=i; //初始化每个窗口的排列顺序 cwins[i][5]=0; } cin>>M; int ind=0; for(i=0;i<M;i++){ cin>>x>>y; if(notDclickTitle==0&&x==lx&&y==ly){ res[ind]=res[ind-1];ind++; //记录结果 if(cwins[N-1][5]==0){ cwins[N-1][0]=0; //调整大小 cwins[N-1][1]=Hmax; cwins[N-1][2]=Wmax; cwins[N-1][3]=0; cwins[N-1][5]=1; } else{ for(j=0;j<4;j++) cwins[N-1][j]=owins[res[ind-1]][j]; cwins[N-1][5]=0; } notDclickTitle=1; } else{ for(j=N-1;j>=0;j--){ if(x>=cwins[j][0]&&x<=cwins[j][2]&&y<=cwins[j][1]&&y>=cwins[j][3]){ //单击当前第j个窗口 res[ind++]=cwins[j][4]; int temp[6]; for(k=0;k<6;k++) temp[k]=cwins[j][k]; for(h=j+1;h<N;h++) for(k=0;k<6;k++) cwins[h-1][k]=cwins[h][k]; for(k=0;k<6;k++) cwins[N-1][k]=temp[k]; break; } } if(j==-1){ res[ind++]=-1; notDclickTitle=1; } else{ if(x<=cwins[N-1][2]&&x>=cwins[N-1][0]&&y<=cwins[N-1][1]&&y>=(cwins[N-1][1]-H)) notDclickTitle=0; else notDclickTitle=1; } } lx=x;ly=y; } if(M!=0){ cout<<res[0]; for(i=1;i<M;i++) cout<<' '<<res[i]; cout<<endl; } else cout<<endl; } system("pause"); return 0; }