【题目链接】 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0531

【题目大意】

  给出一张图,和一些矩形障碍物,求该图没被障碍物覆盖的部分被划分为几个连通块

【题解】

  首先对图中的点进行离散化,对于一个障碍物来说,
  我们将其看做左闭右开上闭下开的图形,所以在离散的时候只要离散障碍物的点即可。
  之后我们利用imos积累法得出哪些部分是障碍物,就可以统计连通块了。

【代码】

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <utility>
#include <queue>
using namespace std;
const int N=1050,dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int n,H,W,X1[N],X2[N],Y1[N],Y2[N];
int imos[2*N][2*N];
int compress(int *x1,int *x2,int w){
vector<int>xs;
for(int i=0;i<n;i++){
int tx1=x1[i],tx2=x2[i];
if(1<=tx1&&tx1<w)xs.push_back(tx1);
if(1<=tx2&&tx2<w)xs.push_back(tx2);
}xs.push_back(0);xs.push_back(w);
sort(xs.begin(),xs.end());
xs.erase(unique(xs.begin(),xs.end()),xs.end());
for(int i=0;i<n;i++){
x1[i]=find(xs.begin(),xs.end(),x1[i])-xs.begin();
x2[i]=find(xs.begin(),xs.end(),x2[i])-xs.begin();
}return xs.size()-1;
}
int bfs(){
int ans=0;
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(imos[i][j])continue;
ans++;
queue<pair<int,int> >que;
que.push(make_pair(j,i));
while(!que.empty()){
int nx=que.front().first,ny=que.front().second;
que.pop();
for(int i=0;i<4;i++){
int tx=nx+dx[i],ty=ny+dy[i];
if(tx<0||W<tx||ty<0||H<ty||imos[ty][tx]>0)continue;
que.push(make_pair(tx,ty));
imos[ty][tx]=1;
}
}
}
}return ans;
}
int main(){
while(~scanf("%d%d",&W,&H),W||H){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d%d%d%d",&X1[i],&Y1[i],&X2[i],&Y2[i]);
memset(imos,0,sizeof(imos));
W=compress(X1,X2,W);H=compress(Y1,Y2,H);
for(int i=0;i<n;i++){
imos[Y1[i]][X1[i]]++;
imos[Y1[i]][X2[i]]--;
imos[Y2[i]][X1[i]]--;
imos[Y2[i]][X2[i]]++;
}for(int i=0;i<H;i++)for(int j=1;j<W;j++)imos[i][j]+=imos[i][j-1];
for(int j=0;j<W;j++)for(int i=1;i<H;i++)imos[i][j]+=imos[i-1][j];
printf("%d\n",bfs());
}return 0;
}

  

最新文章

  1. 【JS基础】DOM操作
  2. 同步(Synchronous)和异步(Asynchronous)
  3. Java 实现HTML富文本导出至word完美解决方案
  4. tomcat context配置
  5. 如何删除datatable中的一行数据
  6. URL传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64_encode
  7. STM32——外部中断EXIT实现
  8. python语法快速入门(1)
  9. j2ee servlet listener
  10. poj 2498 动态规划
  11. javascript链式调用实现方式总结
  12. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
  13. iOS 程序间跳转传参(支付和地图)
  14. Javascript Jquery 中的数组定义与操作_子木玲_新浪博客
  15. 啊 B树
  16. Envoy 源码分析--network
  17. 《算法》第四章部分程序 part 13
  18. # 20155337《网络对抗》Web基础
  19. sphinx/Coreseek 4.1 执行make出错
  20. Json字符串转Dictionary

热门文章

  1. Windows批处理中获取日期和时间
  2. java jdbc与odbc数据库的连接mysql数据库
  3. React01补充
  4. JavaWeb笔记(六)MVC与三层架构
  5. linux fork()函数 转载~~~~
  6. SQLEXPRESS 2012 安装NorthWind和Pub数据库
  7. Redis键管理
  8. Password [分块]
  9. ubuntu安装出现&quot;删除initramfs-tools时出错&quot;,subprocess installed post-installation script returned error exit status 1
  10. spring in action 学习笔记六:bean在不同情况下的默认id号或者将名字