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(可能不是整数),表示宝藏的坐标。 输出
输出最少需要开凿的门的个数
每组测试数据的第一行是一个整数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; }
相关文章推荐
- zoj 1158 || poj 1066 Treasure Hunt
- cqbzoj 1158 剔除多余括号
- zoj 1158 判断2线段完全相交
- ZOJ-3626 Treasure Hunt I 树形DP
- 【ZOJ月赛】【树形DP】【I.Destroy】
- 线段树成段更新 zoj 1610
- [ZOJ 3646]Matrix Transformer[二分图匹配]
- [zoj] 1937 [poj] 2248 Addition Chains || ID-DFS
- zoj 1986
- HDU 1158 Employment Planning
- ZOJ 3891 K-hash 后缀自动机
- ZOJ - 3987 - Numbers (高精度,贪心)
- zoj 1240 IBM Minus One
- Treasure Hunt I - ZOJ 3626 树形dp
- ZOJ 3778 Talented Chef
- ZOJ 3767 Elevator(水题)
- ZOJ 1060 poj 1094 Sorting It All Out(拓扑排序或 弗洛德)
- ZOJ-1111
- {DP!}ZOJ 2604
- ZOJ 2314 Reactor Cooling | 无源汇可行流