题目链接: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)相关推荐

  1. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  2. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  3. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  4. 【洛谷】马的遍历--广度优先搜索(BFS)

    题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...

  5. 二叉搜索树(BFS)总结

    满二叉树 定义:高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树. 完全二叉树 定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上.这样的二叉 ...

  6. 广度优先搜索(BFS)与深度优先搜索(DFS)

    一.广度优先搜索(BFS) 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val = xself.left = Nonesel ...

  7. 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

    二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次"解救小哈"的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLi ...

  9. 从起始点到目标点的最短步数(BFS)

    从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在古老的魔兽传说中,有两个军团,一 ...

最新文章

  1. python代码大全p-python处理写入数据代码讲解
  2. 输出商品列表 用户输入序号 显示用户选中的商品
  3. 面试 Java 高级后端开发,要准备哪些知识点?
  4. 大咖开讲:一小时学会.NET MVC开发的那些事儿
  5. 女的喜欢OBC男的喜欢OGC的含义(转)
  6. WARNING: A newer version of conda exists.
  7. 网安入门须知:Python基础导读
  8. MAC/Linux 下 Git 记住用户名密码
  9. 为什么有的人开车舍不得开空调?车载空调耗油吗?
  10. L3-029 还原文件 (30 分)-PAT 团体程序设计天梯赛 GPLT
  11. 第一节:Scrapy开源框架初探
  12. 第八篇: UpdateProgress 控件--显示正在处理中的信息
  13. Oracle数据库-建库、建表空间,建用户
  14. 有感于《游戏脚本高级编程》的劣质翻译
  15. Python字符串编码转换
  16. 计算机说课稿模板小学数学,小学数学说课万能模板精简
  17. 分享一下我在东方时尚学车的经历
  18. 分数排名 mysql_MYSQL分数排名
  19. linux压缩与解压命令
  20. 如何在简历中使用STAR法则

热门文章

  1. cockroachdb的一些网址信息
  2. ESFramework Demo -- P2P通信Demo(附源码)
  3. python 基础及资料汇总
  4. ubantu系统之快捷键使用
  5. 设计模式学习笔记之二:观察者模式
  6. 在线中文繁简体转换工具
  7. linux之mktemp命令
  8. (六)Oracle学习笔记—— 约束
  9. 《MATLAB R2012a超级学习手册》一第1章 MATLAB概述
  10. qml demo分析(clocks-时钟)