hdu1543 Paint the Wall

本文介绍了如何通过离散化和矩阵化处理在二维坐标系统中进行复杂图形的分析和计算,包括数据输入、离散化、矩阵化、绘制和颜色分配等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值