这道题之前写过一次,结果再做又忘了,再做又忘了。所以还是写个博客记录一下。
相对门的两个房间占用同一处走廊,所以例如有1——>3和4——>6移动方式时,它们是共享了同一段走廊的,即3号房间门前的走廊。
处于相对门的两个房间和处于一排的这样子的房间他们都有一个相同点:奇数房间到偶数房间占用的房间数相同。而有个不同点是:相对门奇数到奇数门所占用的房间,其实还要包括她对门的偶数房间。这就是我们下面要处理 的情况
尽管他是相对的房间,但是我们在处理的时候还是把他们当作一排来,所以就要处理1——>3,4——>5的这种情况。
我们把所有是奇数的门都+1变成是他的对门
if(Point[i].x%2==1)
Point[i].x ++;
if(Point[i].y%2==1)
Point[i].y++;
具体代码如下:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
int x;
int y;
int flag ;
};
point Point[210];
int cmp(point &a,point &b)
{
return a.x < b.x;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
int x,y,cnt=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d%d",&Point[i].x,&Point[i].y);
if(Point[i].x%2==1)
Point[i].x ++;
if(Point[i].y%2==1)
Point[i].y++;
if(Point[i].x>Point[i].y)
{
int t= Point[i].x;
Point[i].x = Point[i].y;
Point[i].y = t;
}
Point[i].flag = 1;
}
sort(Point,Point+n,cmp);
for(int i=0;i<n;i++)
{
if(Point[i].flag == 0) continue;//判断过的就不用再算了
int t = Point[i].y;
for(int j=i+1;j<n;j++)
{
if(Point[j].flag == 0)//判断过的就不用再算了
continue;
if(Point[j].x > t)
{
Point[j].flag = 0;
t = Point[j].y;
}
}
cnt++;
}
printf("%d\n",cnt*10);
}
return 0;
}