日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bfs】Replication G(P7151)

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。