AOJ0531(imos-累积和法)
来源:互联网 发布:淘宝助理5天猫用不了 编辑:程序博客网 时间:2024/05/19 15:21
来自《挑战程序设计竞赛》
但是找到的题解和书上给的模板很不一样……
题解参考了http://www.hankcs.com/program/algorithm/aoj-0531-paint-color.html
给出题目的链接http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0531
突然发现,写博客好麻烦,尤其是要做表格什么的╮(╯_╰)╭
AC代码:
#include<algorithm>#include<cctype>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iomanip>#include<iostream>#include<map>#include<queue>#include<string>#include<set>#include<vector>#include<cmath>#include<bitset>#include<stack>#include<sstream>using namespace std;#define INF 0x7fffffffconst int maxn=1005;int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};int W,H,N;int X1[maxn],X2[maxn],Y1[maxn],Y2[maxn];//填充用int fld[2*maxn][2*maxn];//对x1和x2进行坐标离散化//返回离散化之后的宽度int compress(int *x1,int *x2,int w){ vector<int> xs; for(int i=0;i<N;i++){ int tx1=x1[i]; int 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 y=0;y<H;y++){ for(int x=0;x<W;x++){ if(fld[y][x]) continue; ans++; queue<pair<int,int> > que; que.push(make_pair(x,y)); while(!que.empty()){ int sx=que.front().first; int sy=que.front().second; que.pop(); for(int i=0;i<4;i++){ int tx=sx+dx[i]; int ty=sy+dy[i]; if(tx<0||tx>W||ty<0||ty>H) continue; if(fld[ty][tx]>0) continue; que.push(make_pair(tx,ty)); fld[ty][tx]=1; } } } } return ans;}void solve(){ memset(fld,0,sizeof(fld)); //坐标离散化 W=compress(X1,X2,W); H=compress(Y1,Y2,H); //imos法 for(int i=0;i<N;i++){ fld[Y1[i]][X1[i]]++; fld[Y1[i]][X2[i]]--; fld[Y2[i]][X1[i]]--; fld[Y2[i]][X2[i]]++; } //横向累积 for(int i=0;i<H;i++){ for(int j=1;j<W;j++){ fld[i][j]+=fld[i][j-1]; } } //纵向累积 for(int i=1;i<H;i++){ for(int j=0;j<W;j++){ fld[i][j]+=fld[i-1][j]; } } //累积完后,fld非0部分表示有挡板 cout<<bfs()<<endl;}int main(){ while(scanf("%d%d",&W,&H)==2){ if(W==0&&H==0) break; scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d%d%d%d",&X1[i],&Y1[i],&X2[i],&Y2[i]); } solve(); } return 0;}
0 0
- AOJ0531(imos-累积和法)
- imos-累积和法
- 累积
- Hive 累积和的计算
- IMOS简单介绍
- 坐标离散化,imos
- 累积测试分析和目标测试入门
- 矩阵累积和的最大路径
- RMAN差异增量和累积增量
- 差异增量备份和累积增量备份
- SQL之更改累积和的值
- matlab统计 频数、频率和累积频率
- 计算累加和、累积和、日期的定义及其使用
- rman备份中差异增量和累积增量的区别
- Oracle的差异增量备份和累积增量备份
- 用关心和爱累积出来的一种本能
- Oracle的差异增量备份和累积增量备份
- 使用量账本和累积量的区别
- LeetCode 350. Intersection of Two Array II 解题报告
- 汇编预备知识(三)
- jQuery ajax()使用serialize()提交form数据
- 重叠构造函数模式_Telescoping Constructor Pattern_Effective Java 2.0_Item 2知识点
- DOM解析XML文档实例之学生管理系统
- AOJ0531(imos-累积和法)
- 斐波那契数列
- 第三方登录原理
- 通用静态库的生成(模拟器和真机通用)
- 什么是计算机的大小端规则?
- 阿里云服务器
- IPC\DVS\DVR与NVR之间的区别
- RecyclerView知识点小解
- 基于STM32的简易RTOS