用了BFS,7个AC,3个TLE,求大佬教教我哪里还能优化
#include<iostream>
#include<cstdio>
#include<queue>
#define N 410
using namespace std;
typedef pair<int, int> P;
const int INF = -1;
int n, m; //棋盘大小
int sx, sy; //起点坐标
int gx, gy; //终点坐标
int d[N][N]; //到各个位置最短步数的数组
//四个方向移动的向量
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};
//求起点到终点的最短步数
int bfs()
{
queue<P> que;
//初始化
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
d[i][j] = INF;
}
//将起点加入队列,并设置步数为0
que.push(P(sx, sy));
d[sx][sy] = 0;
//不断循环直到队列长度为0
while(que.size())
{
//从队列最前端取出元素
P p = que.front();
que.pop();
//如果取出状态已经是终点,则退出
if(p.first == gx && p.second == gy)
break;
//四个方向的循环
for(int i = 0; i < 8; i++)
{
//移动后的位置
int nx = p.first + dx[i];
int ny = p.second + dy[i];
//可以移动的话,加入队列,并设置步数为到P的步数加1
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && d[nx][ny] == INF)
{
que.push(P(nx, ny));
d[nx][ny] = d[p.first][p.second] + 1;
}
}
}
return d[gx][gy];
}
int main()
{
cin >> n >> m >> sx >> sy;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
gx = i;
gy = j;
int ans = bfs();
if(j == 1)
printf("%d", ans);
else
printf("%5d", ans);
}
printf("\n");
}
return 0;
}