筆者正在準備考研的複試,晚上花了兩個多小時做了一下CCF的前兩題,第一題比較簡單,第二題有點難,這裡分享一下思路:
題目連結:http://wenku.baidu.com/link?url=knJCvNYMG1rCHmxqB0Xg_mk7S1WKJhGlsTNVhi7DOIJKo29mIP--yKf2HUvRMEC7IBMZR-vW9kD6-_-dFjOWgny8GtBFwoN-AfGxMgXyq6G
代碼:
#include <iostream>
using namespace std;
int main()
{
//n表示視窗的個數,m表示點選的次數
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int n,m,i,j,temp=-1,window=-1,a[10][4],b[10][2],c[10],jieguo[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
cin>>n;
cin>>m;
//存儲視窗的範圍
for(i=0;i<n;i++)
{
c[i]=i;//存儲視窗的相對位置,c[0]=0表示第一個視窗在最底下,數字越大越靠近上面
for(j=0;j<4;j++)
{
cin>>a[i][j];
}
}
//存儲點選的位置
for(i=0;i<m;i++)
{
for(j=0;j<2;j++)
{
cin>>b[i][j];
}
}
for(j=0;j<m;j++)//j表示點選次數
{
for(i=0;i<n;i++)
{
if(a[i][0]<=b[j][0]&&a[i][2]>=b[j][0]&&a[i][1]<=b[j][1]&&a[i][3]>=b[j][1])//點選的位置在視窗内
{
if(c[i]>temp)//如果是更上一層的視窗
{
temp=c[i];
window=i;//點選的是第i個視窗
jieguo[j]=i;
}
}
}
if(window!=-1)
{
for(i=0;i<n;i++)
{
if(c[i]>c[window])
c[i]--;
}
c[window]=n-1;//将被選中的視窗置于最上層
}
temp=window=-1;//恢複視窗初始值
}
//列印結果
for(i=0;i<m;i++)
{
if(jieguo[i]!=-1)
cout<<jieguo[i]+1<<endl;
else
cout<<"INGORED"<<endl;
}
return 0;
}
運作環境是VC6.0
in.txt是測試資料所在的檔案,測試資料為
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
out.txt為輸出資料:
2
1
1
INGORED
思路如下:先把測試資料存儲,具體來說n存儲視窗的個數,m存儲點選的次數,a[10][4]存儲每個視窗的範圍,b[10][2]存儲點選的位置,c[10]存儲視窗的相對位置,jieguo[10]存儲最後輸出的值,c[0]=0表示第0個視窗在最下面,數字越大,視窗越靠上,初始時視窗的序号和存儲的位置是相同的
第二步,對每個點選的位置進行測試,就是最外面的那個for循環;如果點選的位置在某個視窗内且該視窗比之前的視窗更靠近上方(c[i]>temp),則window變為該視窗,表示選中
該視窗,之後,調整視窗的相對位置,将被選中的視窗置于最上方,之前在它上方的每個視窗都要下拉一層。
最後列印結果,因為題目中視窗從1開始編号,是以結果都要加1
不足之處希望批評指正