我 #3 和 #10 两个超大数据毒瘤点 TLE 了,我觉得能优化的都优化了。代码大致思路:给 BFS 函数起点和终点,a 数组存地图,b 数组判重,x_init 和 y_init 表示贝西的起点,x_knight 和 y_knight 表骑士的位置。
代码如下
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int dx[] = {0, -1, 1, 0, 0}, dy[] = {0, 0, 0, -1, 1}, N = 1010;
int w, h, a[N][N], x_init, y_init, x_knight, y_knight, ans = 114514;
vector<pair<int, int>> v;
struct node
{
int x, y, step;
};
bool b[N][N];
int bfs(int initx, int inity, int endx, int endy)
{
memset(b, 0, sizeof b);
queue<node> q;
q.push({initx, inity, 0});
b[initx][inity] = 1;
while (!q.empty())
{
int x = q.front().x, y = q.front().y, step = q.front().step;
q.pop();
if (x == endx && y == endy) return step;
if (step >= ans) return -1;
for (int i = 1; i <= 4; i ++ )
{
int _x = x + dx[i], _y = y + dy[i], _step = step + 1;
if (_x == endx && _y == endy) return _step;
if (b[_x][_y] == 0 && (a[_x][_y] == 0 || a[_x][_y] == 2) && _x >= 1 && _x <= h && _y >= 1 && _y <= w)
{
b[_x][_y] = 1;
q.push({_x, _y, _step});
}
}
}
return -1;
}
int main()
{
scanf("%d%d", &w, &h);
for (int i = 1; i <= h; i ++ )
{
for (int j = 1; j <= w; j ++ )
{
scanf("%d", &a[i][j]);
if (a[i][j] == 4)
{
v.push_back({i, j});
}
else if (a[i][j] == 2)
{
x_init = i, y_init = j;
}
else if (a[i][j] == 3)
{
x_knight = i, y_knight = j;
}
}
}
int size_v = v.size();
for (int i = 0; i <= size_v; i ++ )
{
int temp1 = bfs(x_init, y_init, v[i].first, v[i].second);
if (temp1 != -1)
{
int temp2 = bfs(v[i].first, v[i].second, x_knight, y_knight);
if (temp2 != -1)
{
ans = min(ans, temp1 + temp2);
}
}
// int temp1 = bfs(x_init, y_init, v[i].first, v[i].second);
// int temp2 = bfs(v[i].first, v[i].second, x_knight, y_knight);
// if (temp1 != -1 && temp2 != -1) ans = min(ans, temp1 + temp2);
}
printf("%d\n", ans);
return 0;
}