UVALive6663 Count the Regions
来源:互联网 发布:量化交易程序员 招聘 编辑:程序博客网 时间:2024/06/05 04:00
题目链接:https://icpcarchive.ecs.baylor.edu/external/66/6663.pdf
题目大意:给你很多矩形的两点,求把空间分割成几个部分
离散化+DFS
关于离散化:
for(int i=0;i<n;i++) { scanf("%d%d%d%d",&map[i][0],&map[i][1],&map[i][2],&map[i][3]); //把输入的点对应的放在xy数组中 x[i*2 ]=map[i][0]; x[i*2+1]=map[i][2]; y[i*2 ]=map[i][1]; y[i*2+1]=map[i][3]; } sort(x,x+n*2); //排序 sort(y,y+n*2); lenx=unique(x,x+n*2)-x; //去重 leny=unique(y,y+n*2)-y; for(int i=0;i<n;i++) { for(int j=0;j<lenx;j++) if(map[i][0]==x[j]) {map[i][0]=j*2+2;break;} //查找,赋新值 for(int j=0;j<lenx;j++) if(map[i][2]==x[j]) {map[i][2]=j*2+2;break;} //注意赋值之后map的值域 这个在下面的DFS查找中关于范围的界定有用处 for(int j=0;j<leny;j++) if(map[i][1]==y[j]) {map[i][1]=j*2+2;break;} //用错了范围re了好多次 for(int j=0;j<leny;j++) if(map[i][3]==y[j]) {map[i][3]=j*2+2;break;} }
把点离散化之后下面的工作就是将对应的点之间的线连起来,我们用一个vis数组表示线,若vis[i][j]的值为1,则说明点ij是黑的(充当线的一部分)
把图构造好了之后就是一个DFS的过程。
总体代码如下:
#include<iostream>#include<algorithm>#include<cstring>#include<stdio.h>#define N 55using namespace std;int map[N+5][4];int x[N*2+5];int y[N*2+5];int vis[4*N+5][4*N+5];int n;int ans,lenx,leny;int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};void dfs2(int x,int y){ if(vis[x][y]==0) { vis[x][y]=1; for(int i=0;i<4;i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<=2*lenx+2&&ny>=0&&ny<=leny*2+2) dfs2(nx,ny); } }}void dfs1(int x,int y){ if(vis[x][y]==0) { ans++; vis[x][y]=1; for(int i=0;i<4;i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<=2*lenx+2&&ny>=0&&ny<=leny*2+2) dfs2(nx,ny); } }}int main (){ while(scanf("%d",&n)&&n) { ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%d%d%d%d",&map[i][0],&map[i][1],&map[i][2],&map[i][3]); x[i*2 ]=map[i][0]; x[i*2+1]=map[i][2]; y[i*2 ]=map[i][1]; y[i*2+1]=map[i][3]; } sort(x,x+n*2); sort(y,y+n*2); lenx=unique(x,x+n*2)-x; leny=unique(y,y+n*2)-y; for(int i=0;i<n;i++) { for(int j=0;j<lenx;j++) if(map[i][0]==x[j]) {map[i][0]=j*2+2;break;} for(int j=0;j<lenx;j++) if(map[i][2]==x[j]) {map[i][2]=j*2+2;break;} for(int j=0;j<leny;j++) if(map[i][1]==y[j]) {map[i][1]=j*2+2;break;} for(int j=0;j<leny;j++) if(map[i][3]==y[j]) {map[i][3]=j*2+2;break;} } for(int i=0; i<n; i++) { for(int j=map[i][0]; j<=map[i][2]; j++) { vis[j][map[i][1]]=1; vis[j][map[i][3]]=1; } for(int j=map[i][3]; j<=map[i][1]; j++) { vis[map[i][0]][j]=1; vis[map[i][2]][j]=1; } } for(int i=0;i<=lenx*2+2;i++) for(int j=0;j<=leny*2+2;j++) { if(vis[i][j]==0) dfs1(i,j); } cout<<ans<<endl; }}/*34 28 27 1115 20 42 511 24 33 1454 28 27 1112 11 34 27 26 14 1614 16 19 1217 28 27 212300000 1000000 600000 00 600000 1000000 300000*/
0 0
- UVALive6663 Count the Regions
- ZOJ 1652 Count the Regions
- UvaLive 6663 Count the Regions 离散化+DFS
- [UVALive 6663 Count the Regions] (dfs + 离散化)
- UVALIve--6663--Count the Regions【离散化+搜索】
- UVALive 6663 Count the Regions (离散化,染色,dfs)
- UVALive 6663 Count the Regions --离散化+DFS染色
- ACM-ICPC Regionals 2013 >> Asia - Aizu - Count the Regions
- LA 6663 —— Count the Regions(连通分量 + 离散化)
- UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_
- Inside the Oracle SGA Regions
- Getting the CPU count
- hdu3336 Count the string
- 【線段樹】Count the Colors
- UVa10007 - Count the Trees
- hdu3336 Count the string
- Count the colors
- 10699 - Count the factors
- 使用fflush函数导致HDU1880WA
- HDU 2087 剪花布条 KMP入门
- HttpWatch工具简介及使用技巧(转载)
- HDU 2955 Robberies (01背包)
- hdu2177 取(2堆)石子游戏
- UVALive6663 Count the Regions
- 【VIM简明教程】
- hdu 1445 sticks (经典dfs+剪枝)
- java中try cathc finally return 相关异常问题
- [UVALive 6663 Count the Regions] (dfs + 离散化)
- 路由收敛
- 网络协议
- 分析USB平台设备模型框架(1)
- poj 1113 Wall 凸包模板题