jzoj3319-[BOI2013]雪地踪迹【bfs】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3319-[BOI2013]雪地踪迹【bfs】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
一個n?mn*mn?m的雪地,有兩種動物RRR和FFF會在雪地上留下RRR和FFF的腳印(只可以走到相鄰格子,從(1,1)(1,1)(1,1)進入(n,m)(n,m)(n,m)出來,且會覆蓋掉原先的腳印)。
求至少有多少只動物經過
解題思路
首先我們知道(1,1)(1,1)(1,1)所在的聯通塊必定是最后一只經過的動物,因為至少所以我們優先選擇整個聯通塊作為最后一只動物。
然后由這個聯通塊開始向外擴展另一種腳印的聯通塊,之后不停擴展直到擴完為止。
codecodecode
#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int N=4001; const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; int n,m,ans,v[N][N]; int qx[N*N],qy[N*N],l=1,r; char c[N][N],z; queue<int> shix,shiy; inline long long read() {char c;int f=0,d=1;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f; } void bfs(int x,int y,char pos) {shix.push(x);shiy.push(y);while(!shix.empty()){x=shix.front();y=shiy.front();shix.pop();shiy.pop();for(int k=0;k<4;k++){int zx=x+dx[k],zy=y+dy[k];if(zx<1||zy<1||zx>n||zy>m)continue;if(v[zx][zy]||c[zx][zy]!=pos)continue;v[zx][zy]=1;shix.push(zx);shiy.push(zy);qx[++r]=zx;qy[r]=zy;}} } int main() {freopen("data.txt","r",stdin);n=read();m=read();for(int i=1;i<=n;i++)gets(c[i]+1);v[1][1]=qx[++r]=qy[r]=1;bfs(1,1,c[1][1]);z=c[1][1];while(l<=r){ans++;int R=r;if(z=='F') z='R';else z='F';for(int i=l;i<=R;i++)bfs(qx[i],qy[i],z);l=R+1;}cout<<ans; }總結
以上是生活随笔為你收集整理的jzoj3319-[BOI2013]雪地踪迹【bfs】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己配置电脑(电脑如何自己配置)
- 下一篇: Loj2687,jzoj3320-文本编