Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

怎么老超时呀,哪位大牛指点一下

Posted by pengyuan at 2004-11-23 15:39:54 on Problem 2093
这题需要什么精巧的算法吗?
有没有什么极端测试数据。

我的代码基本就是把人脑的思路模拟了一下
每次找出可切的,然后根据题意选一条线切下去

#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator