UVALive 6663 Count the Regions --离散化+DFS染色

题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分。坐标值可能有1e9.

分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数。后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1,并且ans++,就可以了。真是太弱。。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
#define N 207

vector<int> vx,vy;
map<int,int> hx,hy;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int vis[N][N];
int l[55],r[55],t[55],b[55];

bool OK(int nx,int ny)
{
    if(nx >= 0 && nx <= 201 && ny >= 0 && ny <= 201 && !vis[nx][ny])
        return 1;
    return 0;
}

void dfs(int x,int y)
{
    vis[x][y] = 1;
    for(int k=0;k<4;k++)
    {
        int nx = x + dx[k];
        int ny = y + dy[k];
        if(OK(nx,ny))
            dfs(nx,ny);
    }
}

int main()
{
    int n,i,j;
    while(scanf("%d",&n)!=EOF && n)
    {
        vx.clear();vy.clear();
        hx.clear();hy.clear();
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d%d",&l[i],&t[i],&r[i],&b[i]);
            vx.push_back(l[i]);
            vx.push_back(r[i]);
            vy.push_back(t[i]);
            vy.push_back(b[i]);
        }
        sort(vx.begin(),vx.end());
        vx.erase(unique(vx.begin(),vx.end()),vx.end());  //运用STL巧妙去重
        sort(vy.begin(),vy.end());
        vy.erase(unique(vy.begin(),vy.end()),vy.end());
        for(i=0;i<vx.size();i++)  //以2为间隔,防止出现面积为1的小矩形计算不到的情况
            hx[vx[i]] = 2*i+1;
        for(i=0;i<vy.size();i++)
            hy[vy[i]] = 2*i+1;
        for(i=0;i<n;i++)  //离散后的值
        {
            l[i] = hx[l[i]];
            t[i] = hy[t[i]];
            r[i] = hx[r[i]];
            b[i] = hy[b[i]];
        }
        memset(vis,0,sizeof(vis));
        for(i=0;i<n;i++)    //边界赋值
        {
            for(j=b[i];j<=t[i];j++)
            {
                vis[j][l[i]] = 1;
                vis[j][r[i]] = 1;
            }
            for(j=l[i];j<=r[i];j++)
            {
                vis[t[i]][j] = 1;
                vis[b[i]][j] = 1;
            }
        }
        int cnt = 0;
        for(i=0;i<=201;i++)
        {
            for(j=0;j<=201;j++)
            {
                if(!vis[i][j])
                {
                    cnt++;
                    dfs(i,j);
                }
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

UVALive 6663 Count the Regions --离散化+DFS染色

时间: 2024-10-10 05:49:39

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 题意: 二维平面内给出若干矩形,平面被矩形的边分为若干个区域,求一共有多少区域. 分析: 由于矩形只有50个,离散化后的平面大约是100*100的.不妨对于每个矩形覆盖的区域进行染色(用二进制位状压),相同颜色的联通块就是一个区域,只要dfs找联通块的个数即可.值得注意

UvaLive 6663 Count the Regions 离散化+DFS

链接:http://vjudge.net/problem/viewProblem.action?id=49408 题意:在平面内给出若干个矩形,求出它们能将整个平面分成多少份. 思路:刚开始一眼看到觉得是几何题,但是发现最多只有50个矩形后,灵光一闪觉得直接离散化再暴力就可以了.把所有矩形的x,y坐标分别离散化,并且为了防止出现离散的太近导致矩形之前没有空隙的情况,将所有点离散化的坐标记作偶数坐标.然后DFS找到所有矩形之间的空隙. 代码: #include<iostream> #includ

UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

题目链接:点击打开链接 gg..== #include <cstdio> #include <cstring> #include<iostream> #include <queue> #include <set> #include <map> #include <algorithm> #include <string> using namespace std; #define ll long long #def

[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非常小,能够对整个图进行压缩.仅仅要不

hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants to make the graph become a complete bipartite graph with most edges by adding some extra edges. Soda needs you to tell him the maximum number of edges

[LeetCode] Surrounded Regions(DFS、BFS)

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your function, the board should

【POJ - 2386】Lake Counting (dfs+染色)

-->Lake Counting 直接上中文了 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= 100; 1 <= M <= 100) 的正方形来表示.农场中的每个格子可以用'W'或者是'.'来分别代表积水或者土地,约翰想知道他的农场中有多少池塘.池塘的定义:一片相互连通的积水.任何一个正方形格子被认为和与它相邻的8个格子相连. 给你约翰农场的航拍图,确定有多少池塘 Input Line 1

DFS染色解决区域分块问题UVALive 6663

怪我比赛的时候想法太过于杂乱了. 注重于区域的属性了.甚至还想用状态压缩或者是hash来描述分块的区域. 其实我们的可以宏观的角度去审视这个问题.就是求分区的问题.那么我们完全可以标记边框的值为1.即不可行走. 那么我们扫描整片区域.统计一个区域 .就用DFS把这整片区域给覆盖.然后继续扫描下去. 离散化在这里使用. 注意点:在于这是一个数区间块数的问题.假如2者数据没有相差一.也会把一块区域给覆盖掉.这是一个考虑会不会影响离散化后的相邻问题的一个问题. 比赛的时候我当时也没注意.也许以后离散化

Codeforces Round #360 (Div. 1)A (二分图&dfs染色)

题目链接:http://codeforces.com/problemset/problem/687/A 题意:给出一个n个点m条边的图,分别将每条边连接的两个点放到两个集合中,输出两个集合中的点,若不可能则输出-1: 思路:通过画图我们不难发现,图中没有出现长度为奇数的环则是可行的,反之则是不行的.那么现在我们只需判断有木有长度为偶数的环即可. 对于这点我们可以直接用dfs搜索+染色,对于当前标记为1的点,我们将其所有儿子标记为2, 对于当前标记为2的点,将其所有儿子标记为1,若出现某个节点的标