Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
O(n*n*n)的复杂度 说一下解题思路枚举矩形的四个点再枚举矩形的两条竖边 此时一个点与一条竖边与x轴形成唯一一条直线 检验此直线是否通过所有矩形 以下是代码: #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #define inf 1e-8 using namespace std; int n; struct rectangle//存储矩形 { double x,y; double m,n,z; }data[105]; struct node//存储点与答案 { double x,y,z; }data2[420],ans[105]; struct line//存储竖线 { double x,y,m,n,z; }data3[210]; bool findl(node a,line b,node& temp)//寻找直线temp 若不存在返回false { if(a.z==b.z) return false; temp.y=b.z*a.y/a.z; temp.z=b.z;temp.x=b.x; if(temp.y-b.y>-inf && temp.y-b.n<inf)return true; return false; } bool solve(node a,node b,rectangle c,node& temp)//解决直线是否与矩形相交 不相交返回false { if(a.z==c.z) {temp=a;return true;} if(b.z==c.z) {temp=b;return true;} temp.x=(c.z-b.z)*(b.x-a.x)/(b.z-a.z)+b.x; temp.y=(c.z-b.z)*(b.y-a.y)/(b.z-a.z)+b.y; temp.z=c.z; if(temp.x-c.x>-inf && c.m-temp.x>-inf && temp.y-c.y>-inf && c.n-temp.y>-inf)return true; return false; } int main() { int i,j,k,flag; node temp,a; //freopen("in.txt","r",stdin); while((scanf("%d",&n))!=EOF) { for(i=0;i<n;i++) { scanf("%lf%lf%lf%lf%lf",&data[i].x,&data[i].y,&data[i].m,&data[i].n,&data[i].z); data3[i*2].x=data2[i*4].x=data[i].x;data3[i*2].y=data2[i*4].y=data[i].y; data3[i*2].m=data2[i*4+1].x=data[i].x;data3[i*2].n=data2[i*4+1].y=data[i].n; data3[i*2+1].x=data2[i*4+2].x=data[i].m;data3[i*2+1].y=data2[i*4+2].y=data[i].y; data3[i*2+1].m=data2[i*4+3].x=data[i].m;data3[i*2+1].n=data2[i*4+3].y=data[i].n; data3[i*2].z=data3[i*2+1].z=data2[i*4].z=data2[i*4+1].z=data2[i*4+2].z=data2[i*4+3].z=data[i].z; } flag=0; for(i=0;i<n*4;i++) { for(j=0;j<n*2;j++) { if(findl(data2[i],data3[j],temp)) { a=data2[i]; for(k=0;k<n;k++) { if(!solve(a,temp,data[k],ans[k])) break; if(k==n-1){flag=1;break;} } } if(flag==1)break; } if(flag==1)break; } if(flag==1) { printf("SOLUTION\n"); printf("%.6f\n",temp.x-(temp.z*(a.x-temp.x)/(a.z-temp.z))); for(i=0;i<n;i++) { printf("%.6f %.6f %.6f\n",ans[i].x,ans[i].y,ans[i].z);//G++要用%f 不用%lf } } else printf("UNSOLVABLE\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator