当前位置:网站首页>[UVALive 6663 Count the Regions] (dfs + 离散化)[通俗易懂]
[UVALive 6663 Count the Regions] (dfs + 离散化)[通俗易懂]
2022-07-07 20:58:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
题目大意:
在一个平面上有 n (1<=n<=50) 个矩形。给你左上角和右下角的坐标(0<=x<=10^6, 0<=y<=10^6)。问这些矩形将该平面划分为多少块。
解题思路:
因为n非常小,能够对整个图进行压缩。仅仅要不改变每条边的相对位置。对答案没有影响。
能够将这些矩形的坐标离散化,然后把边上的点标记一下。之后进行简单dfs就可以。(注意离散化的时候,两条边之间至少要隔一个距离)
代码:
/*
ID: [email protected]
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define For(i, n) for (int i = 0; i < n; i++)
using namespace std;
const int MOD = 1000000007;
typedef long long ll;
using namespace std;
struct node {
int a, b, c, d;
} rec[600];
int x[1200], y[1200];
int xp[1000100], yp[1000100];
int mp[240][240], n;
int lx, ly;
void gao() {
for (int i = 0; i < n; i++) {
int A = xp[rec[i].a];
int B = yp[rec[i].b];
int C = xp[rec[i].c];
int D = yp[rec[i].d];
for (int j = A; j <= C; j++) mp[j][D] = mp[j][B] = 1;
for (int j = D; j <= B; j++) mp[A][j] = mp[C][j] = 1;
}
}
int dir[4][2] = {{0, -1}, {0, 1}, {1, 0}, { -1, 0}};
bool in(int x, int y) {
return (x >= 0 && y >= 0 && x < 2 * lx + 1 && y < 2 * ly + 1);
}
void dfs(int x, int y) {
mp[x][y] = 1;
for (int i = 0; i < 4; i++) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if (in(xx, yy) && !mp[xx][yy]) {
dfs(xx, yy);
}
}
}
int main() {
while(scanf("%d", &n) != EOF && n) {
for (int i = 0; i < n; i++) {
scanf("%d%d%d%d", &rec[i].a, &rec[i].b, &rec[i].c, &rec[i].d);
x[2 * i] = rec[i].a;
x[2 * i + 1] = rec[i].c;
y[2 * i] = rec[i].b;
y[2 * i + 1] = rec[i].d;
}
sort(x, x + 2 * n);
sort(y, y + 2 * n);
lx = unique(x, x + 2 * n) - x;
ly = unique(y, y + 2 * n) - y;
for (int i = 0; i < lx; i++) {
xp[x[i]] = 2 * i + 1;
}
for (int j = 0; j < ly; j++) {
yp[y[j]] = 2 * j + 1;
}
memset(mp, 0, sizeof(mp));
gao();
int fk = 0;
for (int i = 0; i < 2 * lx; i++) {
for (int j = 0; j < 2 * ly; j++) if (mp[i][j] == 0) {
dfs(i, j);
fk++;
}
}
cout << fk << endl;
}
return 0;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116289.html原文链接:https://javaforall.cn
边栏推荐
- 恶魔奶爸 B3 少量泛读,完成两万词汇量+
- 凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
- 【C语言】指针进阶---指针你真的学懂了吗?
- Tensorflow2.x下如何运行1.x的代码
- Postgresql数据库character varying和character的区别说明
- Solve the problem that the executable file of /bin/sh container is not found
- 【函数递归】简单递归的5个经典例子,你都会吗?
- Cantata9.0 | new features
- Small guide for rapid formation of manipulator (11): standard nomenclature of coordinate system
- 神兵利器——敏感文件发现工具
猜你喜欢
Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance
Static analysis of software defects codesonar 5.2 release
SQL注入报错注入函数图文详解
Apifox interface integrated management new artifact
Tensorflow2. How to run under x 1 Code of X
智能软件分析平台Embold
C语言多角度帮助你深入理解指针(1. 字符指针2. 数组指针和 指针数组 、数组传参和指针传参3. 函数指针4. 函数指针数组5. 指向函数指针数组的指针6. 回调函数)
How does codesonar help UAVs find software defects?
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
神兵利器——敏感文件发现工具
随机推荐
Jetty:配置连接器[通俗易懂]
Ubuntu安装mysql8遇到的问题以及详细安装过程
机械臂速成小指南(十二):逆运动学分析
MySQL storage expression error
201215-03-19—cocos2dx内存管理–具体解释「建议收藏」
Data sorting in string
恶魔奶爸 A1 语音听力初挑战
软件缺陷静态分析 CodeSonar 5.2 新版发布
恶魔奶爸 A3阶段 近常速语流初接触
Implement secondary index with Gaussian redis
Tensorflow2. How to run under x 1 Code of X
H3C s7000/s7500e/10500 series post stack BFD detection configuration method
权限不足
Klocwork code static analysis tool
恶魔奶爸 A0 英文零基础的自我提升路
凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
Cocos2d-x 游戏存档[通俗易懂]
刚开户的能买什么股票呢?炒股账户安全吗
CodeSonar通过创新型静态分析增强软件可靠性
Network principle (1) - overview of basic principles