UVALIve6663--Count the Regions【离散化+搜索】

题意:一个平面上给你最多50个矩形,可以相交、覆盖,问他们把平面分割成了几部分,整个图形外面广大的空白区域也算一部分。

记得以前见过这种题,当时不会做也没做。现在看到这题还是没想法。在吴琦的讲解和代码下终于弄明白了。

思路是这样,根据他给的坐标点,排序、去重,然后重新构建一个图,至少在相邻两个点之间空出一个点表示被分割的区域,这样之后才能进行搜索,这实际上是把整个图形压缩下来,将中间的空白区域缩小,然后再根据原来的边的信息在新的图里标记出边的信息。然后进行搜索

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100005
#define eps 1e-7
#define INF 0x7FFFFFFF
#define ff sqrt(5.0)
typedef long long ll;

struct node{
    int l,t,r,b;
}rec[60];
int x[120],y[120];
int mapp[210][210];
int xx[1000010],yy[1000010];
int lx,ly;
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
bool cango(int x,int y){
    if(x>=1&&y>=1&&x<=2*lx-2&&y<=2*ly-2)    return true;
    return false;
}
void dfs(int x,int y){
    mapp[x][y] = 1;
    for(int i=0;i<4;i++){
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(cango(xx,yy)&&mapp[xx][yy]==0)   dfs(xx,yy);
    }
}
int main(){
    int n,i,ans,totx,toty;
    while(scanf("%d",&n),n){
        ans = totx = toty = 0;
        memset(mapp,0,sizeof(mapp));
        for(i=0;i<n;i++){
            scanf("%d%d%d%d",&rec[i].l,&rec[i].t,&rec[i].r,&rec[i].b);
            x[totx++] = rec[i].l;
            y[toty++] = rec[i].t;
            x[totx++] = rec[i].r;
            y[toty++] = rec[i].b;
        }
        sort(x,x+totx);
        sort(y,y+toty);
        lx = unique(x,x+totx) - x;
        ly = unique(y,y+toty) - y;
        for(i=0;i<lx;i++){
            xx[x[i]] = 2*i;
        }
        for(i=0;i<ly;i++){
            yy[y[i]] = 2*i;
        }
        for(i=0;i<n;i++){
            int t1 = xx[rec[i].l];
            int t2 = yy[rec[i].t];
            int t3 = xx[rec[i].r];
            int t4 = yy[rec[i].b];
            for(int j=t1;j<=t3;j++) mapp[j][t2] = mapp[j][t4] = 1;
            for(int j=t2;j>=t4;j--) mapp[t1][j] = mapp[t3][j] = 1;
        }
        for(i=0;i<2*lx;i++){
            if(mapp[i][0]==0)   dfs(i,0);
            if(mapp[i][2*ly-1]==0)  dfs(i,2*ly-1);
        }
        for(i=0;i<2*ly;i++){
            if(mapp[0][i]==0)   dfs(0,i);
            if(mapp[2*lx-1][i]==0)  dfs(2*lx-1,i);
        }
        for(i=0;i<2*lx;i++){
            for(int j=0;j<2*ly;j++){
                if(mapp[i][j]==0){
                    ans++;
                    dfs(i,j);
                }
            }
        }
        cout<<ans+1<<endl;
    }
    return 0;
}

UVALIve6663--Count the Regions【离散化+搜索】

时间: 2024-10-29 19:05:43

UVALIve6663--Count the Regions【离散化+搜索】的相关文章

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

题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数.后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1,并且ans++,就可以了.真是太弱.. 代码: #include <iostream> #include <cstdi

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

[LeetCode] Surrounded Regions 广度搜索

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

ElasticSearch(8)-分布式搜索

分布式搜索的执行方式 在继续之前,我们将绕道讲一下搜索是如何在分布式环境中执行的. 它比我们之前讲的基础的增删改查(create-read-update-delete ,CRUD)请求要复杂一些. 注意: 本章的信息只是出于兴趣阅读,使用Elasticsearch并不需要理解和记住这里的所有细节. 阅读这一章只是增加对系统如何工作的了解,并让你知道这些信息以备以后参考,所以别淹没在细节里. 一个CRUD操作只处理一个单独的文档.文档的唯一性由_index, _type和routing-value

算法_图的深度优先搜索和广度优先搜索

一.图的基本数据结构 图是由一组顶点和一组能够将两个顶点相互连接的边所构成的,一般使用0~V-1这样的数字形式来表示一张含有V个顶点的图.用v-w来指代一张图的边,由于是无向图,因此v-w和w-v是同一种边的两种表示方法.无向图是指边没有方向的图结构在无向图中,边仅仅表示的是两个顶点之间的连接.图的数据结构的可视化如下图所示(其中边上的箭头没有任何意义): 当两个顶点通过一条边相互连接,则称这两个顶点是相邻的.某个顶点的度数即为依附它的边的总数.当两个顶点之间存在一条连接双方的路径的时候,称为这

Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)

原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话.输入的语句是如何变成搜索条件的上一篇已经略有提及. 4.3.1 观察表达式在研究表达式之前,一定要知道,任何一个Query都会对于一个表达式.不光可以通过Query构造表达式,还可以通过拼接字符串构造.这里说的观察表达式是指,用Query完成查询语句后,用ToString()方法输出Query的表达式.很简单是吧,呵呵. 4.3.2 表达式的与或非“与或非”让我想起