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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

牛客 - 街机争霸(bfs)

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客 - 街机争霸(bfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個n*m的迷宮,要求從起點到終點的最少時間,與一般情況不同的是,這個題目規定有 p 只僵尸,每只僵尸有固定的方向且會沿著相應的方向游走 k 個單位,然后原路返回,我們不能占據僵尸路徑上的點,否則下一秒就會被僵尸吃掉,問此時的最少時間

題目分析:今下午比賽的時候讀完這個題覺得是個bfs,看過的人比較少以為挺難寫的,于是就去睡覺了。。其實加了個無關緊要的條件,還是一個簡單的bfs,因為每個僵尸都有固定的路徑,所以可以形成周期,隨便畫畫就能發現周期其實是 2 * k - 2,給vis數組多加一維用來記錄周期就好了,剩下的就是簡單的模板題了

代碼:

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=510;const int b[4][2]={0,1,0,-1,1,0,-1,0};//Right,Left,Down,Upint n,m,p,k,ans;char maze[N][N];bool zombie[N][N][25];//zombie[x][y][time]void init()//初始化僵尸的位置 (2*k-2) 為一個周期 {while(p--){int x,y;char s[10];scanf("%d%d%s",&x,&y,s);int pos;if(s[0]=='R')pos=0;else if(s[0]=='L')pos=1;else if(s[0]=='D')pos=2;else if(s[0]=='U')pos=3;zombie[x][y][0]=true;for(int i=1;i<k;i++){x+=b[pos][0];y+=b[pos][1];zombie[x][y][i]=true; }for(int i=k;i<2*k-2;i++){x-=b[pos][0];y-=b[pos][1];zombie[x][y][i]=true;}} }struct Node {int x,y,step;Node(int x,int y,int step):x(x),y(y),step(step){} };bool vis[N][N][25];//vis[x][y][time%mod]bool bfs() {queue<Node>q;int mod=2*k-2;//記錄周期 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(maze[i][j]=='L'){q.push(Node(i,j,0));vis[i][j][0]=true;}while(q.size()){Node cur=q.front();q.pop();if(maze[cur.x][cur.y]=='A'){ans=cur.step;return true;}for(int i=0;i<4;i++){int xx=cur.x+b[i][0];int yy=cur.y+b[i][1];int time=(cur.step+1)%mod;if(xx<=0||xx>n||yy<=0||yy>m)//越界 continue;if(maze[xx][yy]=='&')//墻 continue;if(zombie[xx][yy][time])//僵尸continue;if(vis[xx][yy][time])//走過了continue;vis[xx][yy][time]=true;q.push(Node(xx,yy,cur.step+1)); }}return false; }int main() { //#ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); //#endif // ios::sync_with_stdio(false);scanf("%d%d%d%d",&n,&m,&p,&k);for(int i=1;i<=n;i++)scanf("%s",maze[i]+1);init();if(bfs())printf("%d\n",ans);elseputs("Oh no");return 0; }

?

總結

以上是生活随笔為你收集整理的牛客 - 街机争霸(bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

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