没有TLE,代码如下:
#include<stdio.h>
#include<queue>
using namespace std;
char a[1209][1209];
int dis[1209][1209];
bool vis[1209][1209];
struct node
{
int x, y;
};
queue < node > q;
int pA[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int pB[4][2] = {{2, 0}, {-2, 0}, {0, 2}, {0, -2}};
int pC[4][2] = {{1, 1}, {-1, 1}, {-1, -1}, {1, -1}};
inline void SPFA(int n, int sx, int sy)
{
for (int i = 1;i <= n;i ++)
for (int j = 1;j <= n;j ++)
dis[i][j] = 1e9, vis[sx][sy] = 0;
dis[sx][sy] = 1;
vis[sx][sy] = 1;
if (a[sx][sy] != '*')
q.push((node){sx, sy});
while (q.size())
{
int x = q.front().x, y = q.front().y;
vis[x][y] = 0;
q.pop();
for (int i = 0;i < 4;i ++)
{
int nx, ny;
if (a[x][y] == 'A')
nx = pA[i][0] + x, ny = pA[i][1] + y;
if (a[x][y] == 'B')
nx = pB[i][0] + x, ny = pB[i][1] + y;
if (a[x][y] == 'C')
nx = pC[i][0] + x, ny = pC[i][1] + y;
if (a[nx][ny] != '*' && nx >= 1 && nx <= n && ny >= 1 && ny <= n)
{
if (a[x][y] != 'C' && dis[nx][ny] > dis[x][y] + 1)
{
dis[nx][ny] = dis[x][y] + 1;
if (!vis[nx][ny])
q.push((node){nx, ny}), vis[nx][ny] = 1;
}
if (a[x][y] == 'C' && dis[nx][ny] > dis[x][y] + 1)
{
dis[nx][ny] = dis[x][y] + 1;
if (!vis[nx][ny])
q.push((node){nx, ny}), vis[nx][ny] = 1;
}
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1;i <= n;i ++)
scanf("%s", a[i] + 1);
SPFA(n, 1, 1);
int ans = dis[n][n];
SPFA(n, 1, n);
if (dis[n][n] < ans)
ans = dis[n][n];
SPFA(n, n, 1);
if (dis[n][n] < ans)
ans = dis[n][n];
if (dis[n][n] != 1e9)
printf("%d", dis[n][n]);
else
printf("No answer");
return 0;
}