[UVALive 6663 Count the Regions] (dfs + 离散化)[通俗易懂]

[UVALive 6663 Count the Regions] (dfs + 离散化)

大家好,又见面了,我是全栈君。

链接:https://icpcarchive.ecs.baylor.edu/index.php?

option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675

题目大意:

在一个平面上有 n (1<=n<=50) 个矩形。给你左上角和右下角的坐标(0<=x<=10^6, 0<=y<=10^6)。问这些矩形将该平面划分为多少块。

解题思路:

因为n非常小,能够对整个图进行压缩。仅仅要不改变每条边的相对位置。对答案没有影响。

能够将这些矩形的坐标离散化,然后把边上的点标记一下。之后进行简单dfs就可以。(注意离散化的时候,两条边之间至少要隔一个距离)

代码:

/*
ID: wuqi9395@126.com
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.net/116289.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月23日 下午2:00
下一篇 2022年1月23日 下午2:00


相关推荐

  • 魔兽世界WOW服务器端的模拟器【2010】[通俗易懂]

    记不清从什么时候开始,国内出现了很多所谓的魔兽世界私服网站,而且在淘宝上还有什么魔兽世界单机版在出售,其实这些东西都是利用国外的一些开源软件如MaNGOS和ArcEmu来实现的。一、MaNGOS http://getmangos.com/MaNGOS不是一个魔兽私服模拟器(wowemu),它是一个开源的自由软件项目,是用c++和C#编程语言实现的一个支持大型多人在线角色扮演游戏服务

    2022年4月15日
    267
  • Django-PyCharm调试

    Django-PyCharm调试目录 一 PyCharm 命令运行项目 1 打开自己创建的 MyDjango 项目 2 配置 DjangoServer 1 打开 运行 调试配置对话框 编辑 2 在对话框中配置运行时访问的路径和端口号 3 运行项目查看调试结果 1 单击此运行按钮 编辑 2 启动成功 3 查看访问路径 4 获取结果 编辑 二 PyCharm 调试项目录屏操作一 PyCharm 命令运行项目 1 打开自己创建的 MyDjango 项目 2 配置 DjangoServer 1 打开 运行 调试配置对话框 2 在对话框中配置运行时访问的路径和

    2026年3月18日
    1
  • 一元二次方程的十字相乘法

    一元二次方程的十字相乘法十字相乘法的方法就是 十字左边相乘等于二次项系数 右边相乘等于常数项 交叉相乘再相加等于一次项系数 十字相乘法能把某些二次三项式分解因式 这种方法的关键是把二次项系数 a 分解成两个因数 a1 a2 的积 a1 a2 把常数项 c 分解成两个因数 c1 c2 的积 c1 乘 c2 并使 a1c2 a2c1 正好是一次项 b 那么可以直接写成结果 ax2 bx c a1x c1 a2x c2 在运用这种方法分解因式时

    2026年3月17日
    2
  • VS2005 SP1补丁下载与安装(转摘)「建议收藏」

    VS2005 SP1补丁下载与安装(转摘)「建议收藏」1.先从微软网站下载补丁.    下载地址1为:http://download.microsoft.com/download/6/3/c/63c69e5d-74c9-48ea-b905-30ac3831f288/VS80sp1-KB926601-X86-ENU.exe(英文版)    下载地址2为:http://download.microsoft.com/download

    2022年10月5日
    2
  • 数据库中的schema

    数据库中的schema数据库中的schema

    2022年4月25日
    50
  • 女生学java软件开发怎么样?就业前景如何?

    女生学java软件开发怎么样?就业前景如何?学java目前现状是男生多于女生,从事java工作的也是男生多于女生,那么这种现状是说女生学java不好找工作吗?​  一、女生适合从事java吗?  在很多人的潜意识里,认为女生是不适合从事java工作的,因为他们觉得从事java工作的人逻辑性要相当的好,并且专业操作水平要高,而女生往往在这方面比较弱。其实这只是一种偏见,就像古代人觉得女子不该干涉朝政一样,女生也是适合从事java工作的,并且还能发挥自己的优势把java工作做得更好。  二、女生学java好找工作吗?  1.现在的女生

    2022年7月9日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号