Flood Fill

可以在线性的复杂度内找到某点所在连通块

1.Lake Counting

#include <cstring>
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N=1010;
typedef pair<int,int> PII;
int n,m;
char g[N][N];
PII q[N*N];
bool st[N][N];
void bfs(int sx,int sy)
{int hh=0,tt=0;q[0]={sx,sy};st[sx][sy]=true;while(hh<=tt){PII t=q[hh++];for(int i=t.x-1;i<=t.x+1;i++)for(int j=t.y-1;j<=t.y+1;j++){if(i==t.x&&j==t.y) continue;if(i<0||i>=n||j<0||j>=m)continue;if(g[i][j]=='.'||st[i][j]) continue;q[++tt]={i,j};st[i][j]=true;}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%s",g[i]);int cnt=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(g[i][j]=='W'&&!st[i][j]){bfs(i,j);cnt++;}printf("%d\n",cnt);return 0;
}

2.The Castle

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=55;
int n,m;
int g[N][N];
PII q[N*N];
bool st[N][N];
int bfs(int sx,int sy)
{int dx[4]={0,-1,0,1};int dy[4]={-1,0,1,0};int hh=0,tt=0;int area=0;q[0]={sx,sy};st[sx][sy]=true;while(hh<=tt){PII t=q[hh++];area++;for(int i=0;i<4;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a<0||a>=n||b<0||b>=m) continue;if(st[a][b]) continue;if(g[t.x][t.y]>>i&1) continue;q[++tt]={a,b};st[a][b]=true;}}return area;
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>g[i][j];int cnt=0,area=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(!st[i][j]){area=max(area,bfs(i,j));cnt++;}}cout<<cnt<<endl;cout<<area<<endl;return 0;
}

3.山峰和山谷

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=1010;
typedef pair<int,int> PII;
int n;
int h[N][N];
PII q[N*N];
bool st[N][N];
void bfs(int sx,int sy,bool& has_higher,bool& has_lower)
{int hh=0,tt=0;q[0]={sx,sy};st[sx][sy]=true;while(hh<=tt){PII t=q[hh++];for(int i=t.x-1;i<=t.x+1;i++)for(int j=t.y-1;j<=t.y+1;j++){if(i==t.x&&j==t.y) continue;if(i<0||i>=n||j<0||j>=n) continue;if(h[i][j]!=h[t.x][t.y]){if(h[i][j]>h[t.x][t.y]) has_higher=true;else has_lower=true;}else if(!st[i][j]){q[++tt]={i,j};st[i][j]=true;}}}
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&h[i][j]);int cnt1=0,cnt2=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(!st[i][j]){bool has_higher=false,has_lower=false;bfs(i,j,has_higher,has_lower);if(!has_higher) cnt1++;if(!has_lower) cnt2++;}cout<<cnt1<<" "<<cnt2<<endl;return 0;
}

最短路模型

1.迷宫问题

#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N=1010;
int n;
int g[N][N];
PII q[N*N];
PII st[N][N];
void bfs(int sx,int sy)
{int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};int hh=0,tt=0;q[0]={sx,sy};memset(st,-1,sizeof st);st[sx][sy]={0,0};while(hh<=tt){auto t=q[hh++];for(int i=0;i<4;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a<0||a>=n||b<0||b>=n) continue;if(g[a][b]) continue;if(st[a][b].x!=-1) continue;q[++tt]={a,b};st[a][b]=t;}}}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&g[i][j]);bfs(n-1,n-1);PII end(0,0);while(true){printf("%d %d\n",end.x,end.y);if(end.x==n-1&&end.y==n-1) break;end=st[end.x][end.y];}return 0;
}

2.武士风度的牛

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=155;
int n,m;
char g[N][N];
PII q[N*N];
int dis[N][N];
int bfs()
{int dx[8]={-2,-1,1,2,2,1,-1,-2};int dy[8]={1,2,2,1,-1,-2,-2,-1};int sx,sy;for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(g[i][j]=='K')sx=i,sy=j;int hh=0,tt=0;q[0]={sx,sy};memset(dis,-1,sizeof dis);dis[sx][sy]=0;while(hh<=tt){auto t=q[hh++];for(int i=0;i<8;i++){int a=t.x+dx[i],b=t.y+dy[i];if(a<0||a>=n||b<0||b>=m) continue;if(g[a][b]=='*') continue;if(dis[a][b]!=-1) continue;if(g[a][b]=='H') return dis[t.x][t.y]+1;q[++tt]={a,b};dis[a][b]=dis[t.x][t.y]+1;}}return -1;
}
int main()
{cin>>m>>n;for(int i=0;i<n;i++)cin>>g[i];cout<<bfs()<<endl;return 0;
}

3.捕牛记

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k;
int q[N];
int dis[N];
int bfs()
{memset(dis,-1,sizeof dis);dis[n]=0;q[0]=n;int hh=0,tt=0;while(hh<=tt){int t=q[hh++];if(t==k) return dis[k];if(t+1<N&&dis[t+1]==-1){dis[t+1]=dis[t]+1;q[++tt]=t+1;}if(t-1>=0&&dis[t-1]==-1){dis[t-1]=dis[t]+1;q[++tt]=t-1;}if(t*2<N&&dis[t*2]==-1){dis[t*2]=dis[t]+1;q[++tt]=t*2;}}return -1;
}
int main()
{while(scanf("%d%d",&n,&k)!=EOF){if(n==-1&&k==-1) break;printf("%d\n",bfs());}return 0;
}

BFS Flood Fill and 最短路模型相关推荐

  1. 【搜索专题】BFS中的Flood Fill和最短路模型

    整理的算法模板合集: ACM模板 A.AcWing 1097. 池塘计数 基础模板题练练手 #include<iostream> #include<cstdio> #inclu ...

  2. BFS——Flood Fill模型及最短路模型

    文章目录 Flood Fill模型 概述 模板 池塘计数 城堡问题 山峰和山谷 最短路模型 概述 迷宫问题 武士风度的牛 抓住那头牛 总结 Flood Fill模型 概述 定义 从一个起始节点开始把附 ...

  3. 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs

    题目分析 来源:acwing 分析:这道题还是flood fill算法的应用,不同点在于八个方向扫描,习惯性采用二重循环来扫描周围的8个方向:其次,这里需要统计周围比它高的和比它矮的,这点用bool变 ...

  4. 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs

    题目分析 来源:acwing 分析:找房间个数,也就是找连通的个数. 样例画出来的房间个数如下图:其中'|' 和'-'不是墙,只有#是墙. 分析:这题不用建图,直接bfs(flood fill)来做, ...

  5. 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs

    Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...

  6. AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】

    AcWing 1113. 红与黑 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 解法一(BFS): 解法二(DFS): 四.其它题解 一.题目链接 AcWing 1113. ...

  7. BFS 之Flood Fill 算法

    一个很重要的点:只有边权为1时才能应用BFS算法 习题篇:(12条消息) BFS 之Flood Fill 算法(二)_Dream.Luffy的博客-CSDN博客 算法介绍:  一如往常,我们先看看Fl ...

  8. usaco The Castle(flood fill)

    问题:城堡有n*m个方块组成,方块四周可能有墙,分别用1(W),2(N),4(E),8(S)来表示,每个方块由一个数字来表示,由四周的分布的墙值和来表示.要求求出城堡有多少个房间,最大房间的大小及删除 ...

  9. 算法提高课学习——2.搜索——2.1.Flood Fill算法

    Flood Fill Flood Fill算法用于求图中的连通块数量,一般用BFS实现,不过也可以使用DFS来实现,更加简洁,但同时也可能会有爆栈的风险 对于图中的任意一个点,我们从该点出发标记它所有 ...

最新文章

  1. Spring Cloud构建微服务架构:消息驱动的微服务(消费组)【Dalston版】
  2. Mysql -uroot -p 登陆不上_MySQL命令行登陆,远程登陆MySQL 的方法
  3. java split
  4. android avd orientation support,Android AVD-无法旋转风景/人像
  5. 七天开发安卓软件(五)
  6. Linux-安装FFmpeg
  7. C++的最后一道坎|百万年薪的程序员
  8. 7月10日任务 添加自定义监控项目、配置邮件告警、测试告警、不发邮件的问题处理...
  9. 电脑网络基础知识:ipconfig/all命令及nslookupDns查询命令
  10. Windows 控制台cmd中文乱码的解决办法
  11. Struts2基本的执行过程
  12. linux 查看ip和路由,Linux route命令详解:查看和操作IP路由表
  13. 页面中插入视频的方法---video/embed/iframe总结
  14. Jenkins集成GitHub
  15. 入门级,Hadoop详情教程(一)
  16. mysql事务回滚是什么意思_Mysql事务提交及事务回滚是什么意思
  17. 动态规划---多边形游戏
  18. 音频对游戏玩家体验的影响有多大?
  19. 看电影学英语五招必备
  20. 计算机机房ups电池常用配置表,机房UPS配置和解决方案

热门文章

  1. ModuleNotFoundError: No module named ‘mayavi‘解决办法
  2. 盘点微信吐槽点,你中了几个?
  3. Mybatis注解开发的搭建
  4. 中国国内学术论文期刊 查询 发布 平台的网站主页 推荐
  5. 抽样(蒙特卡洛法)到底是在干啥?
  6. SSH配置(局域网两台ubuntu主机传输数据),scp or rsync命令
  7. 深度学习常见损失函数总结+Pytroch实现
  8. 前端js之浮动和定位
  9. C语言中字符串的两种定义方式
  10. 机器学习之随机森林(一)