您的位置:首页 > 其它

zoj 1158 Treasure Hunt

2012-04-21 13:22 127 查看
输入 第一行输入一个正数N(N<10)表示测试数据组数

每组测试数据的第一行是一个整数n(0<=n<=30),代表了墙的个数,随后的n行里每行有四个整数x1,x2,y1,y2,这四个数分别是代表一个墙的两个端点的坐标。外围的正方形四个顶点固定在(0,0)(0,100)(100,0)(100,100)这四堵个墙不在上面的n个数里。注意,不能在两个线的交点处开凿门。

数据保证任意两个中间墙的交点不在四周的墙上。

输完所有的墙后,输入两个数,x,y(可能不是整数),表示宝藏的坐标。 输出
输出最少需要开凿的门的个数

#include <stdio.h>
#include <stdlib.h>
#define file_r(x) freopen(x, "r", stdin)
#define file_w(x) freopen(x, "w", stdout)
#define ZERO 1e-4
struct interior
{
int x1, y1, x2, y2;
}inner[40];
struct sides
{
int a, b, c;
}side[40];
struct exterior
{
int x, y;
}outer[40];
//判断宝藏与内墙位置
void judge(struct interior w, struct sides *e)
{
e->a = w.y2 -w.y1;
e->b = w.x1 -w.x2;
e->c = w.x2*w.y1 - w.x1*w.y2;
}
int main()
{
//file_r("1.in");
//file_w("2.out"); //文件出入结束是在最上面的。。
int i, j, k;
int x1, y1, x2, y2;
int n;
double tx, ty;
int s1[40];
int N;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
// 外墙的端点坐标
outer[0].x = 0;  outer[0].y = 0;
outer[1].x = 0;  outer[1].y = 100;
outer[2].x = 100;  outer[2].y = 100;
outer[3].x = 100;  outer[3].y = 0;
int sp = 3;
for(i=0; i<n; i++)
{
scanf("%d%d%d%d",&x1, &y1, &x2, &y2);
outer[++sp].x = x1;  //墙的端点坐标
outer[sp].y = y1;
outer[++sp].x = x2;
outer[sp].y = y2;
inner[i].x1 = x1;
inner[i].y1 = y1;
inner[i].x2 = x2;
inner[i].y2 = y2;
}
scanf("%lf%lf",&tx, &ty);
double side0;
for(i=0; i<n; i++)
{
judge(inner[i], &side[i]);
side0 = side[i].a *tx +side[i].b*ty + side[i].c;
if(side0>ZERO) s1[i] = 1;
else if(side0<ZERO) s1[i] = -1;
else s1[i] = 0;
}
int door;
int minDoor = 9999;
int side1;
int s2;
for(i=0; i<sp; i++)
for(j=i+1; j<=sp; j++)
{
x1 = outer[i].x + outer[j].x;
y1 = outer[i].y + outer[j].y;
// 这两个墙端点位于某一侧外墙
if(x1==0||y1==0||x1==200||y1==200)
{
door = 0;
for(k=0; k<n; k++)
{
side1 = side[k].a*x1 + side[k].b*y1 + 2*side[k].c; //是2倍
if(side1>0) s2 = 1;
else if(side1<0) s2 = -1;
else
{
door = 9999; break;
}
if(s2!=s1[k]) door++;
}
if(minDoor>door) minDoor = door;
}
}
printf("Number of doors = %d\n",++minDoor);
if(N) printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: