Compare commits

..

No commits in common. "0db4fdd6b004cc118cfee58f5d1ff2115b752141" and "c2def12c801f2c553992503b0627e8d56512171f" have entirely different histories.

View File

@ -1,52 +1,50 @@
#include <iostream> #include<iostream>
#include <cstdio> #include<cstdio>
#include <cmath> #include<cmath>
#include <cstring> #include<cstring>
using namespace std; using namespace std;
const double inf = 1e100, EPS = 1e-6; const double inf=1e100,EPS=1e-6;
const int W = 20; const int W=20;
double l, now; double l,now;
int n; int n;
//一道墙
struct wall struct wall
{ {
double x, y[6], val[5]; double x,y[6],val[5];
} w[W]; } w[W];
// big bug:double->int //big bug:double->int
double length(double x1, double y1, double x2, double y2) double length(double x1,double y1,double x2,double y2)
{ {
double x = x1 - x2, y = y1 - y2; double x=x1-x2,y=y1-y2;
return sqrt(x * x + y * y); return sqrt(x*x+y*y);
} }
double cross(double x1, double y1, double x2, double y2) double cross(double x1,double y1,double x2,double y2)
{ {
return x1 * y2 - x2 * y1; return x1*y2-x2*y1;
} }
double same(double x0, double y0, double x3, double y3, double x1, double y1, double x2, double y2) double same(double x0,double y0,double x3,double y3,double x1,double y1,double x2,double y2)
{ {
double x = x3 - x0, y = y3 - y0; // y0->x0 double x=x3-x0,y=y3-y0;//y0->x0
return cross(x, y, x1 - x0, y1 - y0) * cross(x, y, x2 - x0, y2 - y0); return cross(x,y,x1-x0,y1-y0)*cross(x,y,x2-x0,y2-y0);
} }
// WA double 判断正负要用 //WA double 判断正负要用
int sign(double d) int sign(double d)
{ {
if (fabs(d) < EPS) if(fabs(d)<EPS)
{ {
return 0; return 0;
} }
else else return d>0? 1:-1;
return d > 0 ? 1 : -1;
} }
bool ob(int li, int lj, int ri, int rj) bool ob(int li,int lj,int ri,int rj)
{ {
for (int i = li + 1; i < ri; i++) for(int i=li+1; i<ri; i++)
{ {
for (int j = 0; j <= 4; j += 2) for(int j=0; j<=4; j+=2)
{ {
// printf("(%.0lf,%.0lf)(%.0lf,%.0lf)/(%.0lf,%.0lf)(%.0lf,%.0lf):",w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]); // printf("(%.0lf,%.0lf)(%.0lf,%.0lf)/(%.0lf,%.0lf)(%.0lf,%.0lf):",w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]);
// printf("[%.2lf/%.2lf]\n",same(w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]),same(w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj],w[i].x,w[i].y[j],w[i].x,w[i].y[j+1])); // printf("[%.2lf/%.2lf]\n",same(w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]),same(w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj],w[i].x,w[i].y[j],w[i].x,w[i].y[j+1]));
//两个都同方向才是,应该&&,错以为|| ,不是0都是真 两个小于0才是香蕉 //两个都同方向才是,应该&&,错以为|| ,不是0都是真 两个小于0才是香蕉
if (sign(same(w[i].x, w[i].y[j], w[i].x, w[i].y[j + 1], w[li].x, w[li].y[lj], w[ri].x, w[ri].y[rj])) < 0 && sign(same(w[li].x, w[li].y[lj], w[ri].x, w[ri].y[rj], w[i].x, w[i].y[j], w[i].x, w[i].y[j + 1])) < 0) if(sign(same(w[i].x,w[i].y[j],w[i].x,w[i].y[j+1],w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj]))<0&&sign(same(w[li].x,w[li].y[lj],w[ri].x,w[ri].y[rj],w[i].x,w[i].y[j],w[i].x,w[i].y[j+1]))<0)
{ {
return 0; return 0;
} }
@ -54,71 +52,68 @@ bool ob(int li, int lj, int ri, int rj)
} }
return 1; return 1;
} }
void find(int ii, int jj) void find(int ii,int jj)
{ {
for (int i = 0; i < ii; i++) for(int i=0; i<ii; i++)
{ {
for (int j = 1; j <= 4; j++) for(int j=1; j<=4; j++)
{ {
l = length(w[ii].x, w[ii].y[jj], w[i].x, w[i].y[j]); l=length(w[ii].x,w[ii].y[jj],w[i].x,w[i].y[j]);
now = w[i].val[j] + l; // i j ii,jj搞反了 now=w[i].val[j]+l;//i j ii,jj搞反了
if (now < w[ii].val[jj] && ob(i, j, ii, jj)) if(now<w[ii].val[jj]&&ob(i,j,ii,jj))
{ {
w[ii].val[jj] = now; w[ii].val[jj]=now;
} }
// printf("(%.0lf,%.0lf)(%.0lf,%.0lf):length:%.3lf,now:%.3lfval:%.3lf\n",w[ii].x,w[ii].y[jj],w[i].x,w[i].y[j],l,now,w[ii].val[jj]); // printf("(%.0lf,%.0lf)(%.0lf,%.0lf):length:%.3lf,now:%.3lfval:%.3lf\n",w[ii].x,w[ii].y[jj],w[i].x,w[i].y[j],l,now,w[ii].val[jj]);
if (i == 0) if(i==0) break;
break;
} }
} }
} }
void doit() void doit()
{ {
for (int i = 1; i <= n; i++) for(int i=1; i<=n; i++)
{ {
for (int j = 1; j <= 4; j++) for(int j=1; j<=4; j++)
{ {
find(i, j); find(i,j);
if (i == n) if(i==n) break;
break;
} }
} }
} }
int main() int main()
{ {
while (1) while(1)
{ {
scanf("%d", &n); scanf("%d",&n);
if (n == -1)// 结束 if(n==-1) return 0;
return 0; memset(&w,0,sizeof(wall)*(n+1));
memset(&w, 0, sizeof(wall) * (n + 1)); w[0].x=0;
w[0].x = 0; w[0].y[1]=5;
w[0].y[1] = 5; w[0].val[1]=0;
w[0].val[1] = 0; for(int i=1; i<=n; i++)
for (int i = 1; i <= n; i++)
{ {
w[i].y[0] = 0; w[i].y[0]=0;
w[i].y[5] = 10; w[i].y[5]=10;
for (int j = 1; j <= 4; j++) //又打成i for(int j=1; j<=4; j++)//又打成i
{ {
w[i].val[j] = inf; w[i].val[j]=inf;
} }
} }
for (int i = 1; i <= n; i++) for(int i=1; i<=n; i++)
{ {
scanf("%lf", &w[i].x); scanf("%lf",&w[i].x);
// cin>>w[i].x; // cin>>w[i].x;
for (int j = 1; j <= 4; j++) // 又是j for(int j=1; j<=4; j++)// 又是j
{ {
scanf("%lf", &w[i].y[j]); scanf("%lf",&w[i].y[j]);
// cin>>w[i].y[j]; // cin>>w[i].y[j];
} }
} }
w[++n].x = 10; w[++n].x=10;
w[n].y[1] = 5; w[n].y[1]=5;
w[n].val[1] = inf; // bug 没赋值 w[n].val[1]=inf;// bug 没赋值
doit(); doit();
printf("%.2lf\n", w[n].val[1]); printf("%.2lf\n",w[n].val[1]);
} }
return 0; return 0;
} }