当前位置:网站首页>[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
边栏推荐
- Do you have to make money in the account to open an account? Is the fund safe?
- MySQL storage expression error
- H3C s7000/s7500e/10500 series post stack BFD detection configuration method
- 让这个CRMEB单商户微信商城系统火起来,太好用了!
- Make this crmeb single merchant wechat mall system popular, so easy to use!
- 恶魔奶爸 B1 听力最后壁垒,一鼓作气突破
- Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
- AADL Inspector 故障树安全分析模块
- 复杂因子计算优化案例:深度不平衡、买卖压力指标、波动率计算
- Implement secondary index with Gaussian redis
猜你喜欢

智能软件分析平台Embold
MySQL storage expression error

The latest version of codesonar has improved functional security and supports Misra, c++ parsing and visualization

Make this crmeb single merchant wechat mall system popular, so easy to use!

C语言 整型 和 浮点型 数据在内存中存储详解(内含原码反码补码,大小端存储等详解)

Codesonar Webinar
Mysql子查询关键字的使用方式(exists)

Tensorflow2. How to run under x 1 Code of X

Don't fall behind! Simple and easy-to-use low code development to quickly build an intelligent management information system

Intelligent software analysis platform embold
随机推荐
开户必须往账户里面赚钱吗,资金安全吗?
机械臂速成小指南(十一):坐标系的标准命名
Micro service remote debug, nocalhost + rainbow micro service development second bullet
让这个CRMEB单商户微信商城系统火起来,太好用了!
Validutil, "Rethinking the setting of semi supervised learning on graphs"
程序猿赚的那点钱算个P啊!
如何挑选基金产品?2022年7月份适合买什么基金?
Alibaba cloud award winning experience: how to mount NAS file system through ECS
CodeSonar网络研讨会
Small guide for rapid formation of manipulator (11): standard nomenclature of coordinate system
How to choose financial products? Novice doesn't know anything
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]
目前股票开户安全吗?可以直接网上开户吗。
恶魔奶爸 A1 语音听力初挑战
机械臂速成小指南(十二):逆运动学分析
MinGW MinGW-w64 TDM-GCC等工具链之间的差别与联系「建议收藏」
字符串中数据排序
C language helps you understand pointers from multiple perspectives (1. Character pointers 2. Array pointers and pointer arrays, array parameter passing and pointer parameter passing 3. Function point
Codeforces 474 F. Ant colony