SGU 320 The Influence of the Mafia(BFS)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=320
题意:给n*m(1<=n m<=500)的矩阵,每个上下左右相邻的相同数字代表一个黑帮,不同的黑帮有可能是同一数字,如果黑帮的范围>=K那么称为大黑帮, 如果一个点被一个大黑帮完全包围(也就是说这个点逃到无穷远处必须经过某一个黑帮)或者该点就是组成大黑帮的元素,那么则该点是危险的,问有多少危险的点。
思路:搜索每个分量,记录L,R,U,D。搜到一个大黑帮后,搜索(U-1,L-1)(D+1,R+1)这个矩形内不属于这个大黑帮的,将属于的标记为答案。我终于知道什么是flood-fill
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <set> #include <stack> #include <string> #include <map>#define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define abs(x) ((x)>=0?(x):-(x)) #define i64 long long #define u32 unsigned int #define u64 unsigned long long #define clr(x,y) memset(x,y,sizeof(x)) #define CLR(x) x.clear() #define ph(x) push(x) #define pb(x) push_back(x) #define Len(x) x.length() #define SZ(x) x.size() #define PI acos(-1.0) #define sqr(x) ((x)*(x)) #define MP(x,y) make_pair(x,y)#define FOR0(i,x) for(i=0;i<x;i++) #define FOR1(i,x) for(i=1;i<=x;i++) #define FOR(i,a,b) for(i=a;i<=b;i++) #define DOW0(i,x) for(i=x;i>=0;i--) #define DOW1(i,x) for(i=x;i>=1;i--) #define DOW(i,a,b) for(i=a;i>=b;i--) using namespace std;void RD(int &x){scanf("%d",&x);} void RD(i64 &x){scanf("%I64d",&x);} void RD(u32 &x){scanf("%u",&x);} void RD(double &x){scanf("%lf",&x);} void RD(int &x,int &y){scanf("%d%d",&x,&y);} void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);} void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);} void RD(double &x,double &y){scanf("%lf%lf",&x,&y);} void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);} void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);} void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);} void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);} void RD(char &x){x=getchar();} void RD(char *s){scanf("%s",s);} void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);} void PR(i64 x) {printf("%I64d\n",x);} void PR(u32 x) {printf("%u\n",x);} void PR(double x) {printf("%.6lf\n",x);} void PR(char x) {printf("%c\n",x);} void PR(char *x) {printf("%s\n",x);} void PR(string x) {cout<<x<<endl;}const int N=505; int a[N][N],n,m,K,id,b[N][N]; int visit[N][N]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0};int OK(int x,int y) {return x>=1&&x<=n&&y>=1&&y<=m; }int L,R,U,D;int DFS(int x,int y) {visit[x][y]=1;U=min(U,x);D=max(D,x);L=min(L,y);R=max(R,y);int i,xx,yy,cnt=1;FOR0(i,4){xx=x+dx[i];yy=y+dy[i];if(OK(xx,yy)&&!visit[xx][yy]&&a[xx][yy]==a[x][y]){cnt+=DFS(xx,yy);}}a[x][y]=id;return cnt; }int visit1[N][N];void DFS1(int x,int y,int t) {visit1[x][y]=1;int i,xx,yy;FOR0(i,4){xx=x+dx[i];yy=y+dy[i];if(xx>=U&&xx<=D&&yy>=L&&yy<=R&&!visit1[xx][yy]&&a[xx][yy]!=t){DFS1(xx,yy,t);}} }int main() {RD(n,m,K);int i,j,k,p,q;clr(a,0);clr(a,-1);FOR1(i,n) FOR1(j,m) scanf("%1d",&a[i][j]);id=10;FOR1(i,n) FOR1(j,m) if(!visit[i][j]){L=U=n+m;R=D=0;id++;k=DFS(i,j);if(k<K) continue;L--; U--; R++; D++;clr(visit1,0);DFS1(U,L,a[i][j]);for(p=U+1;p<D;p++) for(q=L+1;q<R;q++){if(!visit1[p][q]){b[p][q]=1;}}}int ans=0;FOR1(i,n) FOR1(j,m) ans+=b[i][j];PR(ans);return 0; }
SGU 320 The Influence of the Mafia(BFS)相关推荐
- python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...
Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)
一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- 【洛谷】马的遍历--广度优先搜索(BFS)
题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...
- 二叉搜索树(BFS)总结
满二叉树 定义:高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树. 完全二叉树 定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上.这样的二叉 ...
- 广度优先搜索(BFS)与深度优先搜索(DFS)
一.广度优先搜索(BFS) 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val = xself.left = Nonesel ...
- 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次"解救小哈"的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLi ...
- 从起始点到目标点的最短步数(BFS)
从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在古老的魔兽传说中,有两个军团,一 ...
最新文章
- python代码大全p-python处理写入数据代码讲解
- 输出商品列表 用户输入序号 显示用户选中的商品
- 面试 Java 高级后端开发,要准备哪些知识点?
- 大咖开讲:一小时学会.NET MVC开发的那些事儿
- 女的喜欢OBC男的喜欢OGC的含义(转)
- WARNING: A newer version of conda exists.
- 网安入门须知:Python基础导读
- MAC/Linux 下 Git 记住用户名密码
- 为什么有的人开车舍不得开空调?车载空调耗油吗?
- L3-029 还原文件 (30 分)-PAT 团体程序设计天梯赛 GPLT
- 第一节:Scrapy开源框架初探
- 第八篇: UpdateProgress 控件--显示正在处理中的信息
- Oracle数据库-建库、建表空间,建用户
- 有感于《游戏脚本高级编程》的劣质翻译
- Python字符串编码转换
- 计算机说课稿模板小学数学,小学数学说课万能模板精简
- 分享一下我在东方时尚学车的经历
- 分数排名 mysql_MYSQL分数排名
- linux压缩与解压命令
- 如何在简历中使用STAR法则