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 |
用这么长的代码吗?算法不太对吧!In Reply To:怎么老超时呀,哪位大牛指点一下 Posted by:pengyuan at 2004-11-23 15:39:54 > 这题需要什么精巧的算法吗? > 有没有什么极端测试数据。 > > 我的代码基本就是把人脑的思路模拟了一下 > 每次找出可切的,然后根据题意选一条线切下去 > > #include<iostream> > #include <stdio.h> > #include<list> > > using namespace std; > > > int N; > > > struct PT > { > int x0,y0; > > int x1,y1; > int x2,y2; > > int x3,y3; > }rect[2001]; > > > > struct PPT > { > struct PT pt; > > int x1,x2,y1,y2; > > bool hhuos; > }; > > list<struct PPT> rlist; > > > void sort() > { > int i, j; > int l, k; > struct PT tmp; > > > for(i = 0;i < N;i++) > { > for(j = i + 1;j < N;j++) > { > if(rect[i].y0 > rect[j].y0) > { > tmp = rect[i]; > rect[i] = rect[j]; > rect[j] = tmp; > } > else > if(rect[i].y0 == rect[j].y0 && rect[i].x0 > rect[j].x0) > { > tmp = rect[i]; > rect[i] = rect[j]; > rect[j] = tmp; > } > > } > } > } > > > void f(struct PPT &ppt) > { > struct PT rt[2000], tmp; > int num; > > int i; > int j; > int id; > > > > num = 0; > > for(i = 0;i < N;i++) > { > if(rect[i].x0 == ppt.pt.x0 && rect[i].y0 < ppt.pt.y0 && rect[i].y0 > ppt.pt.y1) > { > > rt[num] = rect[i]; > > num++; > } > } > > > for(i = 0;i < num;i++) > { > > for (j=0;j<N;j++) { > if (rect[j].x3==ppt.pt.x3 && rect[j].y3==rt[i].y0) > break; > } > if (j==N) continue; > > int x,y; > bool flag; > > x = rt[i].x3; > y = rt[i].y3; > > > flag = false; > > while(1) > { > > for(j = 0;j < N;j++) > { > if((y == rect[j].y0 && x == rect[j].x0 && x < ppt.pt.x3))// || (y == rect[j].y1 && x == rect[j].x1)) > { > x = rect[j].x3; > y = rect[j].y3; > break; > } > } > > //if(j < N) > //{ > if(x == ppt.pt.x3) > { > flag = true; > break; > } > //} > if (j==N ) > break; > > > } > > if(flag == true) > { > ppt.x1 = rt[i].x0; > ppt.y1 = rt[i].y0; > > ppt.x2 = x; > ppt.y2 = ppt.y1; > > ppt.hhuos=false; > > //cout << "fu false\n"; > return; > } > > else { > //cout << "zhao bu dao"; > } > > } > > > > > num = 0; > > for(i = 0;i < N;i++) > { > if(rect[i].y0 == ppt.pt.y0 && rect[i].x0 > ppt.pt.x0 && rect[i].x0 < ppt.pt.x3) > { > > rt[num] = rect[i]; > > num++; > } > } > > for(i = 0;i < num;i++) > { > > for (j=0;j<N;j++) { > if (rect[j].x1==rt[i].x0 && rect[j].y1==ppt.pt.y1) > break; > } > if (j==N) continue; > > int x,y; > bool flag; > > x = rt[i].x1; > y = rt[i].y1; > > > flag = false; > > while(1) > { > > for(j = 0;j < N;j++) > { > if((y == rect[j].y0 && x == rect[j].x0 && y>ppt.pt.y1))// || (y == rect[j].y1 && x == rect[j].x1)) > { > x = rect[j].x1; > y = rect[j].y1; > break; > } > } > > //if(j < N) > //{ > if(y == ppt.pt.y1) > { > flag = true; > break; > } > //} > if (j==N) > break; > > > } > > if(flag == true) > { > ppt.x1 = rt[i].x0; > ppt.y1 = rt[i].y0; > > ppt.x2 = x; > ppt.y2 = y; > > ppt.hhuos=true; > > //cout << "fu true\n"; > return; > } > > else { > //cout << "zhao bu dao"; > } > > } > > if (num==0) { > ppt.x1=10000; > } > > } > > void findmaxrect() > { > int i; > int minx; > int miny; > int maxx; > int maxy; > > struct PPT r; > > minx = 10000; > miny = 10000; > maxx = -10000; > maxy = -10000; > > for(i = 0;i < N;i++) > { > if(rect[i].x1 < minx) > minx = rect[i].x1; > > if(rect[i].y1 < miny) > miny = rect[i].y1; > > if(rect[i].x3 > maxx) > maxx = rect[i].x3; > > if(rect[i].y3 > maxy) > maxy = rect[i].y3; > } > > r.pt.x0 = minx; > r.pt.y0 = maxy; > > r.pt.x1 = minx; > r.pt.y1 = miny; > > r.pt.x2 = maxx; > r.pt.y2 = miny; > > r.pt.x3 = maxx; > r.pt.y3 = maxy; > > f(r); > > rlist.push_back(r); > > } > > > void solve() > { > int i; > int minx; > int id; > int k; > > list<struct PPT>::iterator p, idd; > idd=rlist.begin(); > > > for(k = 0;k < N - 1;k++) > { > > idd=rlist.begin(); > for(p =rlist.begin();p != rlist.end();p++) > { > > //if(rlist[i].x1 < minx) > //{ > // minx = rlist[i].x1; > // id = i; > //} > > if(p->x1 < idd->x1 || (p->x1 == idd->x1 && p->y2 < idd->y2)) > { > //minx = p->x1; > > idd = p; > } > > > } > > cout << idd->x1 << ' ' << idd->y2 << ' ' << idd->x2 << ' ' << idd->y1 << endl; > > int x10, y10, x11, y11, x12, y12, x13, y13; > int x20, y20, x21, y21, x22, y22, x23, y23; > > x10 = idd->pt.x0; > y10 = idd->pt.y0; > > if(idd->hhuos == false) > { > x11 = idd->x1; > y11 = idd->y1; > > x12 = idd->x2; > y12 = idd->y2; > > x13 = idd->pt.x3; > y13 = idd->pt.y3; > > } > else > { > x11 = idd->pt.x1; > y11 = idd->pt.y1; > > x12 = idd->x2; > y12 = idd->y2; > > x13 = idd->x1; > y13 = idd->y1; > > } > > > > > > > > > if(idd->hhuos == false) > { > x21 = idd->pt.x1; > y21 = idd->pt.y1; > > x22 = idd->pt.x2; > y22 = idd->pt.y2; > > x23 = idd->x2; > y23 = idd->y2; > > > x20 = idd->x1; > y20 = idd->y1; > > } > else > { > x20 = idd->x1; > y20 = idd->y1; > > x21 = idd->x2; > y21 = idd->y2; > > x22 = idd->pt.x2; > y22 = idd->pt.y2; > > x23 = idd->pt.x3; > y23 = idd->pt.y3; > > } > > struct PPT ppt1, ppt2; > > ppt1.pt.x0 = x10; > ppt1.pt.y0 = y10; > > > ppt1.pt.x1 = x11; > ppt1.pt.y1 = y11; > > ppt1.pt.x2 = x12; > ppt1.pt.y2 = y12; > > ppt1.pt.x3 = x13; > ppt1.pt.y3 = y13; > > > ppt2.pt.x0 = x20; > ppt2.pt.y0 = y20; > > > ppt2.pt.x1 = x21; > ppt2.pt.y1 = y21; > > ppt2.pt.x2 = x22; > ppt2.pt.y2 = y22; > > ppt2.pt.x3 = x23; > ppt2.pt.y3 = y23; > > f(ppt1); > > f(ppt2); > > rlist.erase(idd); > > if (ppt1.x1!=10000) > rlist.push_back(ppt1); > if (ppt2.x1!=10000) > rlist.push_back(ppt2); > } > } > > > main() > { > int i; > > while(true) { > cin >> N; > if (N==0) return 0; > > for(i = 0;i < N;i++) { > //cin >> rect[i].x1 >> rect[i].y1 >> rect[i].x3 >> rect[i].y3; > scanf("%d %d %d %d",&rect[i].x1,&rect[i].y1,&rect[i].x3,&rect[i].y3); > rect[i].x0=rect[i].x1; > rect[i].y0=rect[i].y3; > rect[i].x2=rect[i].x3; > rect[i].y2=rect[i].y1; > } > > sort(); > > findmaxrect(); > > solve(); > cout << endl; > } > > > > } > > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator