传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个n∗mn*mn∗m的图,如果某个位置字符为RRR代表兔子走过,如果为FFF代表狐狸走过,如果...代表谁都没走过,每只动物必须从左上角进来,右下角出去,它可以上下左右随意移动,经过的地方会覆盖之前的脚印,每次只能有一个动物进,问最少几只动物经过了草地。

n≤4e3n\le4e3n≤4e3

思路:

考虑左上角和右下角,他们的脚印一定是一样的,如果图内都是这个动物的脚印,设这个脚印为FFF,显然走一次即可。如果有别的动物的脚印,假设存在一个动物的脚印包主了另一个动物的脚印,就是类似正方形,边缘的脚印是RRR,中间脚印是FFF,那么显然需要FFF先走,让后才能走RRR,因为起点终点都是FFF,所以还需要走一次FFF才可以。

考虑上面的情况,这个情况是可以嵌套的,就是一层外面再套一层,如果我们能求出来最大的嵌套了多少层,加上111就是答案了,考虑怎么求最大有多少层呢?

考虑01bfs01bfs01bfs,如果下一个位置与当前的脚印相同,那么边权为000,否则边权为111,可证这样跑下来,取一个距离的最大值+1+1+1即为答案。

// Problem: #2686. 「BalticOI 2013」雪地足迹 Tracks in the Snow
// Contest: LibreOJ
// URL: https://loj.ac/p/2686
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<deque>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=4010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int dis[N][N];
bool st[N][N];
char s[N][N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%s",s[i]+1);memset(dis,0x3f,sizeof(dis));dis[1][1]=0; st[1][1]=true;deque<PII>q; q.push_back({1,1});int dir[4][2]={1,0,-1,0,0,1,0,-1};while(q.size()) {PII u=q.front(); q.pop_front();for(int i=0;i<4;i++) {int dx=u.X+dir[i][0];int dy=u.Y+dir[i][1];if(dx<1||dx>n||dy<1||dy>m||s[dx][dy]=='.'||st[dx][dy]) continue;int w=0; st[dx][dy]=1;if(s[dx][dy]!=s[u.X][u.Y]) w=1;dis[dx][dy]=dis[u.X][u.Y]+w;if(w) q.push_back({dx,dy});else q.push_front({dx,dy});}}int ans=0;for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]!='.') ans=max(ans,dis[i][j]);cout<<ans+1<<endl;return 0;
}
/**/

#2686. 「BalticOI 2013」雪地足迹 双端队列01bfs + 模型转换相关推荐

  1. 【搜索】JZOJ_3319 LOJ_2686 「BalticOI 2013」雪地足迹 Tracks in the Snow

    题意 在一片长方形的草地上,有 2 2 2种动物--兔子和狐狸活动.兔子走过草地会留下 R R R,狐狸走过草地会留下 F F F.每只动物从左上角进入草地,从右下角走出草地.其间,它可以上下左右乱跳 ...

  2. Libre OJ 「BalticOI 2013」非回文数 数位dp

    传送门 文章目录 题意: 思路: 题意: 问[l,r][l,r][l,r]内有多少个数是非回文数,即数字中不存在连续几个数为回文数. l,r≤1e18l,r\le1e18l,r≤1e18 思路: 这么 ...

  3. 算法学习-单调双端队列

    文章目录 基础知识 算法模板 相关题目 239.滑动窗口最大值 1438.绝对差不超过限制的最长连续子数组 862.和至少为K的最短子数组 1425.带限制的子序列和 1499.满足不等式的最大值 2 ...

  4. C++ 双端队列(deque)的使用

    双端队列(deque)是什么 双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector, 双端队列(deque)属于STL(Standard ...

  5. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

  6. python数据结构与算法:队列与双端队列

    双端队列: #################队列#################### #coding:utf-8 """ Deque() 创建一个空的双端队列 ad ...

  7. LeetCode实战:设计循环双端队列

    题目英文 Design your implementation of the circular double-ended queue (deque). Your implementation shou ...

  8. 数据结构之队列、双端队列

    数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...

  9. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

最新文章

  1. ArcGIS Engine开发前基础知识(4)
  2. 互联网经济与实体经济
  3. c++ 传入动态参数_一文了解Mybatis中动态SQL的实现
  4. Python tab 补全
  5. 使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分
  6. 学习Java的相关知识
  7. PTA-Hello World(C语言)
  8. TreeMap的排序
  9. 服务器机柜内手机信号,手机信号强度是什么
  10. android gsm编程,Android新手入门 FAQ
  11. 项目开发文档是必须的
  12. Eclipse 最佳字体 推荐
  13. 计算机网络AD名词解释,计算机网络名词解释 AD是什么意思?
  14. 汇编语言——偏移地址超过有效地址FFFFH
  15. 电脑桌面图标有阴影怎么办
  16. 产权:使用权、收益权和转让权
  17. 多链钱包鼻祖bitpay 10.0.1最新版官方版下载和使用方法
  18. 5月28-29日规模化敏捷联合作战沙盘之乌托邦计划—成都站
  19. 跟我学c++高级篇——模板元编程之十一鸭子类型
  20. oracle怎么查看表的唯一约束,查询(看)表的主键、外键、唯一性约束和索引

热门文章

  1. 增强型的for循环linkedlist_LinkedList的复习
  2. 软件项目组织管理(十)项目沟通管理
  3. 数据告诉你,抖音是如何在半年之内逆袭的
  4. 女神一秒变路人!腾讯研究AI卸妆效果算法出品“一键卸妆”功能
  5. Android带三角形的弹窗,Android实现三角形气泡效果方式汇总
  6. php网站开发期末大作业,大学生期末网页大作业
  7. xencenter vgpu 看不见_有一种设计是“看不见,但感受得到”
  8. 「软件项目管理」一文浅谈软件项目风险计划
  9. 面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
  10. 服务器虚拟化怎么使用,服务器使用中的误区及建议 服务器虚拟化安装步骤