【bfs】Replication G(P7151)
生活随笔
收集整理的這篇文章主要介紹了
【bfs】Replication G(P7151)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
P7151
題目大意
給你一個n*n的方陣,有若干機器人的起始點
機器人在每個時間會向一個方向走一步,經過D個時間后就會在相鄰四個格子復制一個副本,副本會和原機器人走相同方向,同時也會復制
當任意一個機器人的操作碰到障礙,那么所有機器人都會停止操作
問你最多有多少個位置可以被機器人到達
解題思路
首先從障礙進行一遍bfs找出所有點到最近障礙的距離
然后從所有起始點進行一遍bfs,找出到達所有的最短合法路徑長度(移動過程中不接觸到障礙)
得到所有點的最短路徑后考慮計算副本到達的位置,不難發現,如果原地不動讓副本復制所到達的格子都可以直接向一個方向去到達,所以直接擴展給副本即可
code
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 1010 #define mp make_pair #define fs first #define sn second using namespace std; int n,D,ans,p[N][N],zh[N][N],to[N][N]; char c[N][N]; queue<pair<int,int> >d; priority_queue<pair<int,pair<int,int> > >dd; const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; void bfs1() {for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(c[i][j]=='#'){d.push(mp(i,j));zh[i][j]=0;}else zh[i][j]=-1;while(!d.empty()){int x=d.front().fs,y=d.front().sn;d.pop();for(int i=0;i<4;++i){int tx=x+dx[i],ty=y+dy[i];if(tx<=0||n<tx||ty<=0||n<ty)continue;if(zh[tx][ty]==-1){zh[tx][ty]=zh[x][y]+1;d.push(mp(tx,ty));}}}return; } void bfs2() {for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(c[i][j]=='S'){d.push(mp(i,j));to[i][j]=0;}else to[i][j]=-1;while(!d.empty()){int x=d.front().fs,y=d.front().sn;d.pop();if(to[x][y]/D==zh[x][y])continue;for(int i=0;i<4;++i){int tx=x+dx[i],ty=y+dy[i];if(tx<=0||n<tx||ty<=0||n<ty)continue;if(to[tx][ty]==-1&&to[x][y]/D<zh[tx][ty]){//先走再復制,所以算當前節點的半徑to[tx][ty]=to[x][y]+1;d.push(mp(tx,ty));}}}return; } void bfs3() {for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(to[i][j]>=0){to[i][j]/=D;if(to[i][j]==zh[i][j])to[i][j]--;//走到i,j之后不能復制就要特判dd.push(mp(to[i][j],mp(i,j)));}while(!dd.empty()){pair<int,pair<int,int> >h=dd.top();dd.pop();int v=h.fs,x=h.sn.fs,y=h.sn.sn;if(p[x][y])continue;p[x][y]=1;ans++;for(int i=0;i<4;++i){int tx=x+dx[i],ty=y+dy[i];if(tx<=0||n<tx||ty<=0||n<ty)continue;if(!p[tx][ty]&&c[tx][ty]!='#'&&to[tx][ty]<v-1){to[tx][ty]=v-1;//向四周擴展dd.push(mp(to[tx][ty],mp(tx,ty)));}}}return; } main() {scanf("%d%d",&n,&D);for(int i=1;i<=n;++i)scanf("%s",c[i]+1);bfs1();bfs2();bfs3();printf("%d",ans);return 0; }總結
以上是生活随笔為你收集整理的【bfs】Replication G(P7151)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想推出一款便携式概念笔记本电脑联想推出
- 下一篇: 【DP】Bovine Genetics