【训练题】区域个数 坐标离散化+BFS算法

本文介绍了如何使用离散化和BFS(广度优先搜索)算法来解决一个编程竞赛题目,该题目涉及在w*h的网格中,通过n条直线将格子划分为4连通块的问题。通过对坐标进行离散化处理,再运用BFS求解连通分量的数量,从而得出被划分的区域总数。示例和数据范围也进行了说明。
摘要由CSDN通过智能技术生成

【问题描述】
w*h的格子画了n条或垂直或水平宽度为1的直线,求出这些格子被划分成了多少个4连块(上、下、左、右连通)。

【输入格式】
第一行包含两个整数:w和h,表示矩阵的列数和行数(行列编号都从1开始)。
第二行包含一个整数n,表示有n条直线。
接下来的n行,每行包含四个整数:x1,y1,x2,y2,表示一条直线的列号和行号。

【输出格式】
一个整数,表示区域数量。

【输入样例】

10 10
5
1 4 6 4
1 8 10 8
4 1 4 10
9 1 9 5
10 6 10 10

【输出样例】

6

【数据范围】
1<=w,h<=1000000 , 1<=n<=500

【来源】
挑战程序设计竞赛(第2版)164页

思路:因为w*h的值太大,考虑离散化压缩w和h的值,建立新的棋盘。然后BFS求连通分量数即可。

/*
    Name: Zuo_Biao_Li_San_Hua
    Copyright: Twitter & Instagram @stevebieberjr
    Author: @stevebieberjr
    Date: 20/07/16 19:48
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#define maxn 505
using namespace std;

int w,h,n;
int x1[maxn],y1[maxn],x2[maxn],y2[maxn];
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值