计算几何初步——图论加线段相交。。。。

这道题很水,不过还是让我纠结了很久,开始数组越界了导致我开的另一个数组的值无故改变,我还以为是编译器的问题,唉~~~~~~~~~~~~

此题思路很简单:

先求出点与点之间的距离(前提是不与前面的线段规范相交)。

然后直接dij过。

View Code
  1 #include<iostream>
2 #include<cmath>
3 #define EPS 1e-8
4 #define getX(x,y) ((x-1)*4+y+1)
5 #define getY(x,y) ((x-1)*4+y+1)
6 #define MAXN 80
7 #define M 10000000
8 using namespace std;
9
10 double dis[MAXN];
11 double g_map[MAXN][MAXN];
12 bool vis[MAXN];
13
14 struct point {
15 double x, y;
16 }data[MAXN/4][4];
17
18 struct segment {
19 point p1, p2;
20 }seg[MAXN];
21
22 inline double max(double a, double b)
23 {
24 return a>b?a:b;
25 }
26
27 inline double min(double a, double b)
28 {
29 return a<b?a:b;
30 }
31
32 double cross(point &p1, point &p2)
33 {
34 return p2.y*p1.x - p2.x*p1.y;
35 }
36
37 inline double get_dis(point &p1, point &p2)
38 {
39 return sqrt((p2.y - p1.y)*(p2.y - p1.y) + (p2.x - p1.x)*(p2.x - p1.x));
40 }
41
42 bool quick_judge(point &p1, point &p2, point &q1, point &q2)
43 {
44 if (max(p1.x,p2.x) >= min(q1.x,q2.x) && min(p1.x,p2.x) <= max(q1.x,q2.x) &&
45 max(p1.y,p2.y) >= min(q1.y,q2.y) && min(p1.y,p2.y) <= max(q1.y,q2.y))return true;
46 return false;
47 }
48
49 bool straddle_judge(point &p1, point &p2, point &q1, point &q2)
50 {
51 point fir,sec,thr;
52 fir.x = q1.x - p1.x;
53 fir.y = q1.y - p1.y;
54 sec.x = p2.x - p1.x;
55 sec.y = p2.y - p1.y;
56 thr.x = q2.x - p1.x;
57 thr.y = q2.y - p1.y;
58 if (cross(fir,sec)*cross(sec,thr) > EPS)return true;
59 return false;
60 }
61
62 bool is_intersect(point &p1, point &p2, point &q1, point &q2)
63 {
64 if (quick_judge(p1,p2,q1,q2)) {
65 if (straddle_judge(p1,p2,q1,q2) && straddle_judge(q1,q2,p1,p2)) return true;
66 }
67 return false;
68 }
69
70 void dijkstra(int n)
71 {
72 if (dis[n] != M) return ;
73 for (int i(1); i<=n; ++i) {
74 int u = 0;
75 double temp = M;
76 for (int j(1); j<=n; ++j) {
77 if (!vis[j] && dis[j] < temp) {
78 u = j;
79 temp = dis[j];
80 }
81 }
82 vis[u] = true;
83 for (int k(1); k<=n; ++k) {
84 if (g_map[u][k] + dis[u] < dis[k]) {
85 dis[k] = g_map[u][k] + dis[u];
86 }
87 }
88 }
89 }
90
91 void ini(int n)
92 {
93 for (int i(0); i<MAXN; ++i)
94 for (int j(0); j<MAXN; ++j)
95 g_map[i][j] = M;
96 for (int i(0); i<MAXN; ++i)dis[i] = M;
97 memset(vis,false,sizeof(vis));
98 bool flag = true;
99 for (int k(1); k<=(n-1)*3; ++k) {
100 if (!is_intersect(data[0][0],data[n][0],seg[k].p1,seg[k].p2)) {
101 continue;
102 } else {
103 flag = false;
104 break;
105 }
106 }
107 if (flag) dis[(n-1)*4+1] = g_map[(n-1)*4+1][0] = g_map[0][(n-1)*4+1] = get_dis(data[0][0],data[n][0]);
108
109 for (int i(1); i<n; ++i) {
110 for (int sec(0); sec<4; ++sec){
111 bool flag = true;
112 for (int k(1); k<=(n-1)*3; ++k) {
113 if (!is_intersect(data[0][0],data[i][sec],seg[k].p1,seg[k].p2)) {
114 continue;
115 } else {
116 flag = false;
117 break;
118 }
119 }
120 if (flag)dis[getX(i,sec)] = g_map[getX(i,sec)][0] = g_map[0][getY(i,sec)] = get_dis(data[0][0],data[i][sec]);
121 }
122 }
123
124 for (int i(1); i<n; ++i) {
125 for (int fir(0); fir<4; ++fir) {
126 bool flag = true;
127 for (int k(1); k<=(n-1)*3; ++k) {
128 if (!is_intersect(data[i][fir],data[n][0],seg[k].p1,seg[k].p2)) {
129 continue;
130 } else {
131 flag = false;
132 break;
133 }
134 }
135 if (flag)g_map[getX(i,fir)][4*(n-1)+1] = g_map[4*(n-1)+1][getY(i,fir)] = get_dis(data[n][0],data[i][fir]);
136 }
137 }
138 for (int i(1); i<n; ++i) {
139 for (int fir(0); fir<4; ++fir) {
140 for (int j(i+1); j<n; ++j) {
141 for (int sec(0); sec<4; ++sec) {
142 bool flag = true;
143 for (int k(1); k<=(n-1)*3; ++k) {
144 if (!is_intersect(data[i][fir],data[j][sec],seg[k].p1,seg[k].p2)) {
145 continue;
146 } else {
147 flag = false;
148 break;
149 }
150 }
151 if (flag)g_map[getY(j,sec)][getX(i,fir)] = g_map[getX(i,fir)][getY(j,sec)] = get_dis(data[i][fir],data[j][sec]);
152 }
153 }
154 }
155 }
156 }
157
158 inline void input(int n)
159 {
160 int COUNT = 1;
161 for (int i(1); i<n; COUNT += 3,++i) {
162 double x, y0, y1, y2, y3;
163 scanf("%lf%lf%lf%lf%lf",&x,&y0,&y1,&y2,&y3);
164 seg[COUNT].p1.x = x;seg[COUNT].p1.y = 0;
165 data[i][0].x = data[i][1].x = data[i][2].x = data[i][3].x = x;
166 data[i][3].y = y3;
167 data[i][2].y = y2;
168 data[i][1].y = y1;
169 data[i][0].y = y0;
170 seg[COUNT].p2 = data[i][0];
171 seg[COUNT+1].p1 = data[i][1];seg[COUNT+1].p2 = data[i][2];
172 seg[COUNT+2].p1 = data[i][3];
173 seg[COUNT+2].p2.x = x; seg[COUNT+2].p2.y = 10;
174 }
175 data[n][0].x = 10;data[n][0].y = 5;
176 }
177
178
179 int main()
180 {
181 int n;
182 data[0][0].x = 0;
183 data[0][0].y = 5;
184 while (scanf("%d",&n) && n != -1) {
185 input(n+1);
186 ini(n+1);
187 dijkstra(n*4+1);
188 printf("%.2lf\n",dis[n*4+1]);
189 }
190 return 0;
191 }



posted on 2012-01-15 16:19  Dev-T  阅读(277)  评论(0编辑  收藏  举报