现在的位置: 首页 > 综合 > 正文

hdu1543 Paint the Wall

2013年10月21日 ⁄ 综合 ⁄ 共 1628字 ⁄ 字号 评论关闭
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 205
//自己写了一个cin的流输入,果断地WA,maxn最好大于150,因为之间重复可能大于100
int colors[maxn],n,m;		
int x[maxn],y[maxn],lenx,leny,map[10005][10005];
struct rect{
	int x[2],y[2];
	int p;
};	
rect matirx[maxn];
void fucks(int &k){ 
	for(int i=0;i<2;i++){
		int dx=matirx[k].x[i],dy=matirx[k].y[i];
			x[lenx++]=dx;
			y[leny++]=dy;
	}
}
void refucks(){
	int tx=0,ty=0,i=1,j=1;
	while(i<lenx){
		if(x[i]!=x[i-1])
			x[++tx]=x[i];
		i++;
	}
	while(j<leny){
		if(y[j]!=y[j-1])
			y[++ty]=y[j];
		j++;
	}
	lenx=tx+1,leny=ty+1;
}
void getpt(){
	int i,j;
	for(i=0;i<lenx;i++)
		for(j=0;j<leny;j++)
			map[i][j]=0;
}
void panit( int &t){
	for(int i=0;i<t;i++){
		int px[2]={lower_bound(x,x+lenx,matirx[i].x[0])-x,lower_bound(x,x+lenx,matirx[i].x[1])-x};
		//二分查找关键值在数组中的位置
		int py[2]={lower_bound(y,y+leny,matirx[i].y[0])-y,lower_bound(y,y+leny,matirx[i].y[1])-y};
		for(int j=px[0];j<px[1];j++)
			for(int k=py[0];k<py[1];k++)
				map[j][k]=matirx[i].p;
	}
}
int getnum(){
	int sum=0;
	for(int i=0;i<lenx-1;i++){ //再离散后的坐标中寻找着色点矩形框
		for(int j=0;j<leny-1;j++){
				colors[map[i][j]]+=(x[i+1]-x[i])*(y[j+1]-y[j]);
		}
	}
	for(int k=1;k<=100;k++){
		if(colors[k]){
			cout<<k<<" "<<colors[k]<<endl;
			sum++;
		}
	}
	//注意输入输出
	if(sum<=1)
		cout<<"There is "<<sum<<" color left on the wall."<<endl;
	else
		cout<<"There are "<<sum<<" colors left on the wall."<<endl;
	return sum;
}
int main(){
	int t,i,j;
	int Case=0;
	while( scanf("%d%d",&n,&m)  && (n+m)){
		if(Case)
			putchar('\n');
		Case++;
		
		scanf("%d",&t);
		memset(colors,0,sizeof(colors));
		lenx=leny=0;
		for(i=0;i<t;i++){
			for(j=0;j<2;j++)
				scanf("%d%d",&matirx[i].x[j],&matirx[i].y[j]);
			scanf("%d",&matirx[i].p);
			fucks(i);//数据存入离散数组
		}
		sort(x,x+lenx);
		sort(y,y+leny);
		refucks();//数组排重
		printf("Case %d:\n",Case);
		getpt();
		panit(t);
		getnum();
		
	}
	return 0;
}

抱歉!评论已关闭.