USACO3.1 Shaping Regions(rect1)

        漂浮法:从最上面的矩形开始向下求它颜色的面积 ,直到最下面的大矩形。对每一个矩形,从其位置上浮,碰到在它上面的矩形,它就分裂成几个小矩形,递归模拟上浮过程。

        好像某年有个亚洲区的题和这个很像,在屏幕上的矩形的覆盖,不过那个题最多有26个矩形,可以暴力求解,比这个还简单了。

/*
ID:jzzlee1
PROB:rect1
LANG:C++
*/
//#include<iostream>
#include<fstream>
using namespace std;
ifstream cin("rect1.in");
ofstream cout("rect1.out");
long int x1[1010],y1[1010],x2[1010],y2[1010],ans[2510],c[2510];
int n,maxc;
void color(int l,int r,int s,int d,int k,int col)
{
	while( (k<=n)&&((l>=x2[k])||(r<=x1[k])||(d<=y1[k])||s>=y2[k]) )
		k++;
	if( k>n )
	{
		ans[col]+=(r-l)*(d-s);
		return;
	}
	else
	{
		if(l<=x1[k])
		{
			color(l,x1[k],s,d,k+1,col);
			l=x1[k];
		}
		if(r>=x2[k])
		{
			color(x2[k],r,s,d,k+1,col);
			r=x2[k];
		}
		if(s<=y1[k])
		{
			color(l,r,s,y1[k],k+1,col);
			s=y1[k];

		}
		if(d>=y2[k])
		{
			color(l,r,y2[k],d,k+1,col);
			d=y2[k];
		}
	}
}
 void work()
 {
	 int i,j;
	 cin>>x2[0]>>y2[0]>>n;
	 x1[0]=0;
	 y1[0]=0;
	 c[0]=1;
	 maxc=0;
	 for(i=1;i<=n;i++)
	 {
		 cin>>x1[i]>>y1[i]>>x2[i]>>y2[i]>>c[i];
		 if(c[i]>maxc)
		 maxc=c[i];
	 }
	 for(i=n;i>=0;i--)
		 color(x1[i],x2[i],y1[i],y2[i],i+1,c[i]);
	 for(i=1;i<=maxc;i++)
		 if(ans[i]!=0)
			 cout<<i<<" "<<ans[i]<<endl;
 }
 int main()
 {
	 work();
	 return 0;
 }

转载于:https://my.oschina.net/u/347565/blog/66044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值