牛客对应题目链接:kotori和迷宫 (nowcoder.com)
一、分析题目
迷宫问题的扩展。
二、代码
cpp
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 35;
int x1, y1; // 标记起点位置
int n, m;
char arr[N][N];
int dist[N][N];
queue<pair<int, int>> q;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
void bfs()
{
memset(dist, -1, sizeof dist);
dist[x1][y1] = 0;
q.push({x1, y1});
while(q.size())
{
auto [x2, y2] = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int a = x2 + dx[i], b = y2 + dy[i];
if(a >= 1 && a <= n && b >= 1 && b <= m && dist[a][b] == -1 && arr[a][b] != '*')
{
dist[a][b] = dist[x2][y2] + 1;
if(arr[a][b] != 'e')
{
q.push({a, b});
}
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> arr[i][j];
if(arr[i][j] == 'k')
{
x1 = i, y1 = j;
}
}
}
bfs();
int count = 0, ret = 1e9;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(arr[i][j] == 'e' && dist[i][j] != -1)
{
count++;
ret = min(ret, dist[i][j]);
}
}
}
if(count == 0) cout << -1 << endl;
else cout << count << " " << ret << endl;
return 0;
}
三、反思与改进
没有设置好对不同字符的处理条件。