zoukankan      html  css  js  c++  java
  • UVALive 6663 Count the Regions --离散化+DFS染色

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

    分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数。后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1。所以每次看到一个vis=0的点就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
    ",cnt);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3897857.html
Copyright © 2011-2022 走看看