TLE求助
查看原帖
TLE求助
241641
CRISPRCas9楼主2021/4/16 16:51

用了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;
}
2021/4/16 16:51
加载中...