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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

牛客网 【每日一题】5月14日题目 maze

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网 【每日一题】5月14日题目 maze 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld

題目描述

小明來到一個由n x
m個格子組成的迷宮,有些格子是陷阱,用’#‘表示,小明進入陷阱就會死亡,’.'表示沒有陷阱。小明所在的位置用’S’表示,目的地用’T’表示。

小明只能向上下左右相鄰的格子移動,每移動一次花費1秒。

有q個單向傳送陣,每個傳送陣各有一個入口和一個出口,入口和出口都在迷宮的格子里,當走到或被傳送到一個有傳送陣入口的格子時,小明可以選擇是否開啟傳送陣。如果開啟傳送陣,小明就會被傳送到出口對應的格子里,這個過程會花費3秒;如果不開啟傳送陣,將不會發生任何事情,小明可以繼續向上下左右四個方向移動。

一個格子可能既有多個入口,又有多個出口,小明可以選擇任意一個入口開啟傳送陣。使用傳送陣是非常危險的,因為有的傳送陣的出口在陷阱里,如果小明使用這樣的傳送陣,那他就會死亡。也有一些傳送陣的入口在陷阱里,這樣的傳送陣是沒有用的,因為小明不能活著進入。請告訴小明活著到達目的地的最短時間。

輸入描述:

有多組數據。對于每組數據: 第一行有三個整數n,m,q(2≤ n,m≤300,0≤ q ≤ 1000)。
接下來是一個n行m列的矩陣,表示迷宮。 最后q行,每行四個整數x1,y1,x2,y2(0≤ x1,x2< n,0≤ y1,y2<
m),表示一個傳送陣的入口在x1行y1列,出口在x2行y2列。

輸出描述:

如果小明能夠活著到達目的地,則輸出最短時間,否則輸出-1。

示例1
輸入

5 5 1 ..S.. ..... .###. ..... ..T.. 1 2 3 3 5 5 1 ..S.. ..... .###. ..... ..T.. 3 3 1 2 5 5 1 S.#.. ..#.. ###.. ..... ....T 0 1 0 2 4 4 2 S#.T .#.# .#.# .#.# 0 0 0 3 2 0 2 2

輸出

6 8 -1 3

題意:

一個n*m的地圖,S為起點,T為終點,上下左右移動花費為1,傳送服務花費為3.地圖內有#表示不能走,問從S到T最少花費是多少?

題解:

一個方法是用過bfs做,想想沒有傳送帶就是光搜,有了傳送帶就用優先隊列來換掉廣搜的隊列,這樣保證出隊的點都是當前距離起點最近的。
還有個方法就是當做最短路徑來做,根據所給的mn矩陣建圖,建一個從S到T的圖,每個格子當做一個頂點,每個格子與上下左右的格子建立一條權值為1的雙向邊,當遇到傳送帶時,建立從入口到出口的單向邊,邊權為3,然后上最短路板子。
spfa用怕了。。。還是用dijkstra比較安全。。。

代碼:

參考代碼
bfs:

#include <bits/stdc++.h> using namespace std;int const maxn = 300 + 10; struct node {int x, y, step;node(const int &x = 0, const int &y = 0, const int &step = 0) :x(x), y(y), step(step) {}bool operator<(const node & obj) const {return step > obj.step;} };map<pair<int,int>,pair<int,int>> mv; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; int n, m, q; int vis[maxn][maxn]; char mp[maxn][maxn];bool check(int tx, int ty) {if (tx <= 0 || ty <= 0 || tx > n || ty > m) return false;return true; }int bfs(int sx, int sy) {priority_queue<node> q;q.emplace(sx, sy, 0);while (!q.empty()) {int x = q.top().x, y = q.top().y;int s = q.top().step;q.pop();if (vis[x][y]) {continue;}vis[x][y] = 1;if (mp[x][y] == 'T') {return s;}for (int i = 0; i < 4; i++) {int tx = x + dx[i];int ty = y + dy[i];if (check(tx, ty) && mp[tx][ty] != '#' && !vis[tx][ty]) {q.emplace(tx, ty, s + 1);}}if (mv.count({x, y})) {int tx = mv[{x, y}].first;int ty = mv[{x, y}].second;if (check(tx, ty) && mp[tx][ty] != '#' && !vis[tx][ty]) {q.emplace(tx, ty, s + 3);}}}return -1; }int main() {while (cin >> n >> m >> q) {memset(vis, 0, sizeof(vis));mv.clear();int x, y;for (int i = 1; i <= n; i++) {cin >> mp[i] + 1;for (int j = 1; j <= m; j++) {if (mp[i][j] == 'S') {x = i, y = j;}}}while (q--) {int x, y, u, v;cin >> x >> y >> u >> v;x++, y++, u++, v++;mv[{x, y}] = {u, v};}int ans = bfs(x, y);cout << ans << endl;}return 0; }

dijkstra
代碼出處

#include<bits/stdc++.h> using namespace std; const int N=301,M=300*300*4+1001; char a[N][N]; struct node{int v,w,nex; }t[M]; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; bool vis[N*N];int dis[N*N]; int las[N*N],len; inline void add(int u,int v,int w){t[++len]=(node){v,w,las[u]},las[u]=len; } inline void dijkstra(int st){memset(dis,0x3f3f,sizeof(dis));memset(vis,0,sizeof(vis));priority_queue<pair<int,int> >sp;dis[st]=0;sp.push(make_pair(0,st));while(!sp.empty()){int x=sp.top().second;sp.pop();if(vis[x])continue;vis[x]=1;for(int i=las[x];i;i=t[i].nex){int v=t[i].v,w=t[i].w;if(dis[v]>dis[x]+w){dis[v]=dis[x]+w;sp.push(make_pair(-dis[v],v));}}} } int main(){int n,m,q;while(~scanf("%d%d%d",&n,&m,&q)){memset(las,0,sizeof(las)),len=0;int sx,sy,tx,ty;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){scanf(" %c",&a[i][j]);if(a[i][j]=='S'){sx=i,sy=j;}if(a[i][j]=='T'){tx=i,ty=j;}}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(a[i][j]!='#'){for(int k=0;k<4;++k){int x=i+dx[k],y=j+dy[k];if(x&&x<=n&&y&&y<=m&&a[x][y]!='#'){add((i-1)*m+j,(x-1)*m+y,1);}}}}}for(int i=1;i<=q;++i){int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);++x1,++y1,++x2,++y2;add((x1-1)*m+y1,(x2-1)*m+y2,3);}dijkstra((sx-1)*m+sy);if(!vis[(tx-1)*m+ty]){puts("-1");}else{printf("%d\n",dis[(tx-1)*m+ty]);}}return 0; }

總結

以上是生活随笔為你收集整理的牛客网 【每日一题】5月14日题目 maze的全部內容,希望文章能夠幫你解決所遇到的問題。

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