2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫
生活随笔
收集整理的這篇文章主要介紹了
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-逃离迷宫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL-二分查找
- 下一篇: “景驰科技杯”2018年华南理工大学程序