NC245313. 小喵觅食
描述
输入描述
第一行输入两个整数 。
第二行输入两个整数 。
接下来输入 行,每行输入一个长度为 的字符串 表示二维地图。 表示地图坐标为 的位置,其中 表示 PLMM 的初始位置, 表示小喵的初始位置, 表示障碍物不允许通过, 表示空地允许通过。
保证地图中字符 有且仅有一个,字符 有且仅有一个。
输出描述
若小喵可以吃到小鱼干则输出 PLMM 与小喵移动的距离和最小值,否则输出 。
示例1
输入:
5 3 2 1 ... .M. ... ... .P.
输出:
3
说明:
PLMM 进行移动 ,此时小喵闻到了坐标 位置上小鱼干的气味并进行移动 。示例2
输入:
5 3 1 2 **. *M. **. *.. *P.
输出:
5
说明:
PLMM 进行移动 ,此时小喵闻到了坐标 位置上小鱼干的气味并进行移动 。示例3
输入:
5 3 2 1 **. *M. **. *.. *P.
输出:
-1
说明:
PLMM 从初始位置 出发,在至多走 步的条件下无论怎样都无法让小喵闻到小鱼干的气味,所以小喵无法吃到小鱼干。C++(clang++ 11.0.1) 解法, 执行用时: 84ms, 内存消耗: 2384K, 提交时间: 2023-04-20 12:50:36
#include<bits/stdc++.h> using namespace std; char mp[1005][1005]; bool vis[1005][1005]; int go[4][2] = {0,1,1,0,0,-1,-1,0}; struct Point{ int x,y,len; }; int a,b,c,d,i,j,k,r1,r2,n,m; int bfs(){ queue<Point> q; q.push({a,b,0}); vis[a][b] = 1; int len = 0; while(!q.empty()){ Point t; t = q.front();q.pop(); len = t.len; if(t.len <= r1 && abs(t.x - c) + abs(t.y - d) <= r2)k = 1; if(k == 1 && mp[t.x][t.y] == 'M')return len; for(int i = 0;i < 4;i++){ int xx = t.x + go[i][0]; int yy = t.y + go[i][1]; if(xx < 1 || xx > n || yy < 1|| yy > m||vis[xx][yy] == 1|| mp[xx][yy] == '*')continue; vis[xx][yy] = 1; q.push({xx,yy,len + 1}); } } return 0; } int main(){ cin>>n>>m>>r1>>r2; for(int i = 1;i <= n;i++){ for(int j = 1;j <= m;j++){ cin>>mp[i][j]; if(mp[i][j] == 'P')a = i,b = j; if(mp[i][j] == 'M')c = i,d = j; } } int e = bfs(); if(!e)cout<<"-1"; else cout<<e; }