TLE+MLE86分求助
查看原帖
TLE+MLE86分求助
635780
BeBanned楼主2023/6/5 18:47

三遍bfs的方法,分别回答三问,求调

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m;
int a[305][305];
int sx,sy,ex,ey;
int dx[8] = {1,1,-1,-1,2,2,-2,-2};
int dy[8] = {2,-2,2,-2,1,-1,1,-1};
int ans1;
int ans2;
int ans3;
struct node1 // 莲花 - bfs1
{
    int x,y;
    int liancnt;
};
struct node2 // 最短路 - bfs2 路径条数 - bfs3
{
    int x,y;
    int coslian;
    int dis;
};
int d1[305][305];
int d2[305][305];
bool in(int x,int y)
{
    return x > 0 && x <= n && y > 0 && y <= m;
}
int bfs1()
{
    deque<node1> q;
    q.push_front(node1{sx,sy,0});
    memset(d1,0x3f,sizeof(d1));
    d1[sx][sy] = 0;
    while(!q.empty())
    {
        int x = q.front().x;
        int y = q.front().y;
        int liancnt = q.front().liancnt;
        q.pop_front();
        if(x == ex && y == ey) return liancnt;
        for(int i = 0;i < 8;i ++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(!in(nx,ny)) continue;
            if(a[nx][ny] == 2) continue;
            if((a[nx][ny] == 1 || a[nx][ny] == 4) && d1[nx][ny] > liancnt)
            {
                d1[nx][ny] = liancnt;
                q.push_front(node1{nx,ny,liancnt});
            }
            if(a[nx][ny] == 0 && d1[nx][ny] > liancnt + 1)
            {
                d1[nx][ny] = liancnt + 1;
                q.push_back(node1{nx,ny,liancnt + 1});
            }
        }
    }
    return -1;
}
int bfs2()
{
    queue<node2> q;
    q.push(node2{sx,sy,0,0});
    memset(d2,0x3f,sizeof(d2));
    d2[sx][sy] = 0;
    while(!q.empty())
    {
        int x = q.front().x;
        int y = q.front().y;
        int coslian = q.front().coslian;
        int dis = q.front().dis;
        q.pop();
        if(x == ex && y == ey) return dis;
        for(int i = 0;i < 8;i ++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(!in(nx,ny)) continue;
            if(a[nx][ny] == 2) continue;
            if((a[nx][ny] == 1 || a[nx][ny] == 4) && coslian < d2[nx][ny] && coslian <= ans1)
            {
                d2[nx][ny] = coslian;
                q.push(node2{nx,ny,coslian,dis + 1});
            }
            if(a[nx][ny] == 0 && coslian + 1 < d2[nx][ny] && coslian + 1 <= ans1)
            {
                d2[nx][ny] = coslian + 1;
                q.push(node2{nx,ny,coslian + 1,dis + 1});
            }
        }
    }
    return -1;
}
void bfs3()
{
    queue<node2> q;
    q.push(node2{sx,sy,0,0});
    
    memset(d2,0x3f,sizeof(d2));
    d2[sx][sy] = 0;
    
    while(!q.empty())
    {
        int x = q.front().x;
        int y = q.front().y;
        int coslian = q.front().coslian;
        int dis = q.front().dis;
        q.pop();
        if(dis > ans2) break;
        if(x == ex && y == ey) ans3 ++;
        for(int i = 0;i < 8;i ++)
        {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(!in(nx,ny)) continue;
            if(a[nx][ny] == 2) continue;
            if((a[nx][ny] == 1 || a[nx][ny] == 4) && coslian <= d2[nx][ny] && coslian <= ans1)
            {
                d2[nx][ny] = coslian;
                q.push(node2{nx,ny,coslian,dis + 1});
            }
            if(a[nx][ny] == 0 && coslian + 1 <= d2[nx][ny] && coslian + 1 <= ans1)
            {
                d2[nx][ny] = coslian + 1;
                q.push(node2{nx,ny,coslian + 1,dis + 1});
            }
        }
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1;i <= n;i ++)
    {
        for(int j = 1;j <= m;j ++)
        {
            scanf("%d", &a[i][j]);
            if(a[i][j] == 3)
            {
                sx = i;
                sy = j;
            }
            if(a[i][j] == 4)
            {
                ex = i;
                ey = j;
            }
        }
    }
    ans1 = bfs1();
    if(ans1 != -1)
    printf("%d\n", ans1);
    else
    {
        printf("-1\n");
        return 0;
    }
    ans2 = bfs2();
    printf("%d\n", ans2);
    bfs3();
    printf("%d\n", ans3);
    return 0;
}
2023/6/5 18:47
加载中...