#2686. 「BalticOI 2013」雪地足迹 双端队列01bfs + 模型转换
生活随笔
收集整理的這篇文章主要介紹了
#2686. 「BalticOI 2013」雪地足迹 双端队列01bfs + 模型转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你一個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 + 模型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDOL是什么意思网络用语 IDOL介绍
- 下一篇: Linux指令:tar打包与压缩