笔者正在准备考研的复试,晚上花了两个多小时做了一下CCF的前两题,第一题比较简单,第二题有点难,这里分享一下思路:
题目链接:http://wenku.baidu.com/link?url=knJCvNYMG1rCHmxqB0Xg_mk7S1WKJhGlsTNVhi7DOIJKo29mIP--yKf2HUvRMEC7IBMZR-vW9kD6-_-dFjOWgny8GtBFwoN-AfGxMgXyq6G
代码:
#include <iostream>
using namespace std;
/*
2014首届CCF第二题
*/
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
不足之处希望批评指正