日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫

發布時間:2024/4/18 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

題目描述:

給你一個n*m的圖,地圖上’.’代表可以走的地方,而’#’代表陷阱不能走,
‘P’代表人物位置,’K’代表鑰匙,’E’代表出口。人物一個,鑰匙有多個,
(’K’的數量<=50)),出口一個,每個位置可以向(上,下,左,右)四個
方向走一格,花費一個單位時間,現在你需要花費最少的時間拿到鑰匙
然后從迷宮的出口出去(若沒有鑰匙,則不能進入迷宮出口所在的格子)。

輸入描述:

第一行一個整數T(T <= 50),代表數據的組數
接下來一行n,m(n<=500,m<=500),代表地圖的行和列
接下來n行,每行一個長度為m的字符串,組成一個圖。

輸出描述:

如果可以出去,輸出所花費的最少時間。
如果不能出去,輸出一行”No solution”。

輸入:

3
5 5
….P

..E

K#…

…..
5 5
P….
…..
..E..
…..
….K
5 5
P#..E
.#.#.
.#.#.
.#.#.
…#K

輸出:

No solution
12
No solution

解題思路:

  • 錯誤思路
    一開始做的時候想有很多鑰匙,把每種情況列舉出來求最小值。但是這樣很容易超時,一個鑰匙需要兩次BFS(先找鑰匙,只有再找出口),N個鑰匙就要2*N次BFS。
  • 正確思路:
    兩次BFS,一次是從入口遍歷遇到鑰匙就記錄,二次是從出口遍歷遇到鑰匙記錄,最后結果就是兩次BFS都都搜索到的key所對應的最小值。

AC代碼:

#include<bits/stdc++.h> #define ll long long #define N 505 int inf = 0x3f3f3f3f; using namespace std; char g[N][N]; int k[N][N],sum[N][N]; bool vis[N][N]; int n, m; struct ac{int x, y, step; }; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int ans; void bfs(int x, int y){memset(vis, 0, sizeof(vis)); //vis 標記點是否被訪問過 queue<ac>que;ac t;t.x = x;t.y = y;t.step = 0;que.push(t);vis[x][y] = 1;while(!que.empty()){t = que.front();que.pop();int xx, yy;for(int i = 0; i < 4; i++){xx = t.x + dx[i];yy = t.y + dy[i];// 無論從入口還是出口都不用走 'E' if(xx >= 0 && yy >= 0 && xx < n && yy < m && g[xx][yy] != '#' && g[xx][yy] != 'E' && vis[xx][yy] == 0){vis[xx][yy] = 1;if(g[xx][yy] == 'K'){k[xx][yy] += t.step + 1;sum[xx][yy] ++;}if(sum[xx][yy] == 2){ //如果key走了兩次,說明這可key是有效的 ans = min(ans, k[xx][yy]);}ac tt;tt.x = xx;tt.y = yy;tt.step = t.step + 1;que.push(tt);}} } } int main (){ ios::sync_with_stdio(false); //記得加上解除cin和stdio的綁定,不加容易超時 cin.tie(0);int t;cin >> t;while(t--){memset(sum, 0, sizeof(sum));memset(k, 0, sizeof(k));cin >> n >> m;int sx, sy, ex, ey;for(int i = 0; i < n; i ++){for(int j = 0; j < m; j++){cin >> g[i][j];if(g[i][j] == 'P')sx = i, sy = j;if(g[i][j] == 'E')ex = i, ey = j;}}ans = 1e9;bfs(sx, sy); //求入口到key的距離 bfs(ex, ey); //求出口到key的距離 if(ans != 1e9)cout << ans << endl;elsecout << "No solution\n"; } return 0; }

總結

以上是生活随笔為你收集整理的2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫的全部內容,希望文章能夠幫你解決所遇到的問題。

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