传送门
文章目录
- 题意:
- 思路:
题意:
给你一个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;
}
/**/