链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
众所周知,新型冠状病毒的传染性比较强。有一天多多想出家门买东西,但是从家到超市可能会经过高危地段,他想远远的避开这些高危地段并且走最少的路到达超市。
多多每次可以向上、下、左、右四个方向移动。如果一个地段高危,那么多多不会通过高危地段自身及其八个方向的地段。(高危地段自身以及上、下、左、右、左上、左下、右上、右下的地段都不能通过)
如果超市位于高危地段的八个方向内,那么多多不能到达超市。请问他能顺利到达超市吗?如果能的话输出最短路径长度,否则输出"Impossible"。
输入描述:
输入第一行包含两个正整数N,M (1 ≤ N ≤ 50,1 ≤ M ≤ 50) 接下来N行输入长度为M的字符串 字符'S'为家的位置,'E'为超市的位置,'.'代表可走地段,'*'代表高危地段
输出描述:
输出一个整数(最短路径长度)或字符串"Impossible"
示例1
输入
复制3 3 *.. ... .SE
3 3 *.. ... .SE
输出
复制1
1
示例2
输入
复制3 3 S.. ... *.E
3 3 S.. ... *.E
输出
复制4
4
示例3
输入
复制3 3 S.. ... .*E
3 3 S.. ... .*E
输出
复制Impossible
Impossible
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 55;
char a[N][N];
int s[N][N];
int d[N][N];
int n, m;
pair<int, int >home;
pair<int, int >E;
typedef pair<int, int >PII;
queue<PII>q;
int bfs()
{
memset(d, -1, sizeof d);
d[home.first][home.second] = 0;
q.push(home);
int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
while (q.size())
{
PII it = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
int x = it.first + dx[i], y = it.second + dy[i];
if (x > 0 && y > 0 && x <= n && y <= m && d[x][y] == -1 && s[x][y] != 1)
{
d[x][y] = d[it.first][it.second] + 1;
q.push({ x,y });
}
}
}
/*for (int i = 1; i <= 3; i++)
{
for (int j = 1; j < 4; j++)
{
cout << d[i][j] << ' ';
}
cout << endl;
}*/
return d[E.first][E.second];
}
int main()
{
cin >> n >> m;
memset(s, -1, sizeof s);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
if (a[i][j] == '*')
{
s[i][j] = s[i + 1][j] = s[i - 1][j] = s[i][j + 1] = s[i][j - 1] = s[i + 1][j + 1] = s[i + 1][j - 1] = s[i - 1][j + 1] = s[i - 1][j - 1] = 1;
}
if (a[i][j] == 'S')
{
home.first = i, home.second = j;
}
if (a[i][j] == 'E')
{
E.first = i, E.second = j;
}
}
}
if (bfs() != -1)
{
cout << bfs() << endl;
}
else
{
cout << "Impossible" << endl;
}
}