题目:
hsj和lsh最近迷上了pokemon go的游戏。在双十一大物期中考试来临之前,他们想抓一只稀有土拨鼠来攒攒人品(因为土拨鼠的刷新地点最近来到了哈工程)
但是由于土拨鼠过于强大,他的雷霆半月斩以及惊天浪涛沙都可以轻松的将他们两击败,但是他们两的合击必杀技流影电光闪以及天羽屠鼠舞可以将土拨鼠打至昏迷状态,并可将其捕获。
但是因为这是款按时间付费的游戏,他们需要尽快捕捉到土拨鼠(即他们两到土拨鼠的时间之和需要最少),因此他们找到了你来帮他们解决这个问题。 规定每走一步需要花费11分钟。
输入:
输入存在多组(需使用!=EOF)
每组的第一行有两个整数n,m(2<=n,m<=200)
接下来n行,每行包括m个字符
‘Y’表示hsj所在的位置
‘M’表示lsh所在的位置
‘.’表示可以通过的地方
‘#’表示教学楼即不能走的地方
‘@’表示稀有土拨鼠刷新的地方(地图中存在多只稀有土拨鼠)
输出:
对于每组样例输出他们到达土拨鼠刷新点的最小时间总和。
保证每组样例都存在一个土拨鼠刷新点,他们两都能到达
样例:
分析:用两个BFS,最后找同一点和最小的值;除了#以外都是可以通过的
1 #include<iostream> 2 #include<sstream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<string> 6 #include<cstring> 7 #include<algorithm> 8 #include<functional> 9 #include<iomanip> 10 #include<numeric> 11 #include<cmath> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #include<cctype> 16 #define PI acos(-1.0) 17 const int INF = 0x3f3f3f3f; 18 const int NINF = -INF - 1; 19 typedef long long ll; 20 using namespace std; 21 typedef pair<int, int> P; 22 int n, m; 23 char maze[205][205]; 24 P Y, M; 25 int ansy[205][205], ansm[205][205]; 26 int vis[205][205]; 27 int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; 28 void bfs(int flag) 29 { 30 queue<P> q; 31 memset(vis, 0, sizeof(vis)); 32 if (!flag) 33 { 34 for (int i = 0; i < n; ++i) 35 { 36 for (int j = 0; j < m; ++j) 37 ansy[i][j] = INF; 38 } 39 q.push(Y); 40 vis[Y.first][Y.second] = 1; 41 ansy[Y.first][Y.second] = 0; 42 } 43 else 44 { 45 for (int i = 0; i < n; ++i) 46 { 47 for (int j = 0; j < m; ++j) 48 ansm[i][j] = INF; 49 } 50 q.push(M); 51 vis[M.first][M.second] = 1; 52 ansm[M.first][M.second] = 0; 53 } 54 while (q.size()) 55 { 56 P temp = q.front(); 57 q.pop(); 58 for (int i = 0; i < 4; ++i) 59 { 60 int nx = temp.first + dx[i], ny = temp.second + dy[i]; 61 if (0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny] != '#' && !vis[nx][ny]) 62 { 63 vis[nx][ny] = 1; 64 q.push(P(nx, ny)); 65 if (!flag) ansy[nx][ny] = ansy[temp.first][temp.second] + 1; 66 else ansm[nx][ny] = ansm[temp.first][temp.second] + 1; 67 } 68 } 69 } 70 } 71 int main() 72 { 73 while (scanf("%d %d", &n, &m) != EOF) 74 { 75 for (int i = 0; i < n; ++i) 76 { 77 for (int j = 0; j < m; ++j) 78 { 79 cin >> maze[i][j]; 80 if (maze[i][j] == 'Y') Y.first = i, Y.second = j; 81 if (maze[i][j] == 'M') M.first = i, M.second = j; 82 } 83 } 84 bfs(0); 85 bfs(1); 86 int ans = INF; 87 for (int i = 0; i < n; ++i) 88 { 89 for (int j = 0; j < m; ++j) 90 { 91 if (maze[i][j] == '@') 92 ans = min(ans, ansy[i][j] + ansm[i][j]); 93 } 94 } 95 cout << 11 * ans << endl; 96 } 97 return 0; 98 }