2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫
生活随笔
收集整理的這篇文章主要介紹了
2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接
題目描述:
給你一個(gè)n*m的圖,地圖上’.’代表可以走的地方,而’#’代表陷阱不能走,
‘P’代表人物位置,’K’代表鑰匙,’E’代表出口。人物一個(gè),鑰匙有多個(gè),
(’K’的數(shù)量<=50)),出口一個(gè),每個(gè)位置可以向(上,下,左,右)四個(gè)
方向走一格,花費(fèi)一個(gè)單位時(shí)間,現(xiàn)在你需要花費(fèi)最少的時(shí)間拿到鑰匙
然后從迷宮的出口出去(若沒(méi)有鑰匙,則不能進(jìn)入迷宮出口所在的格子)。
輸入描述:
第一行一個(gè)整數(shù)T(T <= 50),代表數(shù)據(jù)的組數(shù)
接下來(lái)一行n,m(n<=500,m<=500),代表地圖的行和列
接下來(lái)n行,每行一個(gè)長(zhǎng)度為m的字符串,組成一個(gè)圖。
輸出描述:
如果可以出去,輸出所花費(fèi)的最少時(shí)間。
如果不能出去,輸出一行”No solution”。
輸入:
3
5 5
….P
..E
K#…
…
…..
5 5
P….
…..
..E..
…..
….K
5 5
P#..E
.#.#.
.#.#.
.#.#.
…#K
輸出:
No solution
12
No solution
解題思路:
- 錯(cuò)誤思路:
一開(kāi)始做的時(shí)候想有很多鑰匙,把每種情況列舉出來(lái)求最小值。但是這樣很容易超時(shí),一個(gè)鑰匙需要兩次BFS(先找鑰匙,只有再找出口),N個(gè)鑰匙就要2*N次BFS。 - 正確思路:
兩次BFS,一次是從入口遍歷遇到鑰匙就記錄,二次是從出口遍歷遇到鑰匙記錄,最后結(jié)果就是兩次BFS都都搜索到的key所對(duì)應(yīng)的最小值。
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 標(biāo)記點(diǎn)是否被訪問(wèn)過(guò) 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];// 無(wú)論從入口還是出口都不用走 '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走了兩次,說(shuō)明這可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的綁定,不加容易超時(shí) 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; }總結(jié)
以上是生活随笔為你收集整理的2018年长沙理工大学第十三届程序设计竞赛 G-逃离迷宫的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STL-二分查找
- 下一篇: “景驰科技杯”2018年华南理工大学程序