//离散化处理 #include<iostream> #include<vector> #include<cstring> #include<algorithm> using namespace std; struct coordinate//坐标结构体 { int x,y; int id;//为每个点标记一个ID,方便关联,id和id+1的便属于同一个矩形 int color; bool used; }; vector<coordinate> v; bool vis[100005];//检测颜色是否出现过 int ans; int G[205][205]; bool cmp_x(coordinate a,coordinate b) { return a.x < b.x; } bool cmp_y(coordinate a,coordinate b) { return a.y < b.y; } int get_connect(int connect_id)//返回同一个矩形相连点的编号 { for(int i = 0;i < v.size();++i) { if(v[i].id == connect_id) { v[i].used = 1; return i; } } } void work(coordinate a,coordinate b)//对矩形内两个点进行颜色值的更新 { for(int i = a.x;i < b.x;++i) for(int j = a.y;j < b.y;++j) G[i][j] += a.color; } int main() { //freopen("in.txt","r",stdin); int n,x1,x2,y1,y2,color; while(scanf("%d",&n) && n) { memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); ans = 0; v.clear(); int id = 0; for(int i = 0;i < n;++i) { scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&color); coordinate p1,p2; p1.id = id++; p2.id = id++; p1.color = p2.color = color; p1.used = p2.used = 0; p1.x = x1; p1.y = y1; p2.x = x2; p2.y = y2; v.push_back(p1); v.push_back(p2); } sort(v.begin(),v.end(),cmp_x);//排序,将坐标按离散化进行压缩 for(int i = 0,xx = 0;i < v.size();++i) { if(i+1 < v.size() && v[i].x != v[i+1].x) v[i].x = xx++; else v[i].x = xx; } sort(v.begin(),v.end(),cmp_y); for(int i = 0,yy = 0;i < v.size();++i) { if(i+1 < v.size() && v[i].y != v[i+1].y) v[i].y = yy++;//坐标压缩 else v[i].y = yy; } for(int i = 0;i < v.size();++i) { if(v[i].used) continue; work(v[i],v[get_connect(v[i].id + 1)]);//将矩形的两个点之间的范围内进行标记 } for(int i = 0;i < 2*n;++i) for(int j = 0;j < 2*n;++j) if(!vis[G[i][j]] && G[i][j] != 0) { ++ans; vis[G[i][j]] = 1; }//注意搜索颜色的时候必须单独出来从头到尾遍历,不能再work里面进行 //因为如果在work里面发现新颜色就+1,会忽略掉有些颜色被完全覆盖这一可能 printf("%d/n",ans); } return 0; }