全部评论 1

  • #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define INF 0x7fffffff
    using namespace std;
    const int Maxt = 32;
    const int Maxn = 3610;
    const int Maxm = Maxn * 5;
    int n,m,p;
    bool a[Maxt][Maxt],vis[Maxn];
    int dx[4] = {-1,0,1, 0},
    dy[4] = { 0,1,0,-1};
    int predis[Maxt][Maxt],dis[Maxn];
    struct game {
    int next,to,w;
    }e[Maxm];
    int top,head[Maxn];
    void add(int u,int v,int val) {
    top++;
    e[top].to=v;
    e[top].w=val;
    e[top].next=head[u];
    head[u]=top;
    }
    struct start {
    int x,y;
    } nxt,cur;
    queue<start>q;
    queue<int>que;
    int numbers(int i,int j) {
    j--;
    return (i-1)*m+j<<2;
    }
    void bfs(int ex,int ey,int px,int py,int d) {
    int cx,cy,nx,ny;
    memset(predis,-1,sizeof(predis));
    predis[px][py]=1;
    predis[ex][ey]=0;
    cur.x=ex,cur.y=ey;
    q.push(cur);
    while(!q.empty()) {
    cur=q.front();
    q.pop();
    cx=cur.x,cy=cur.y;
    for(int i=0; i<4; ++i) {
    nx=cur.x+dx[i],ny=cur.y+dy[i];
    if(a[nx][ny] && predis[nx][ny]-1) {
    predis[nx][ny]=predis[cx][cy]+1;
    nxt.x=nx,nxt.y=ny;
    q.push(nxt);
    }
    }
    }
    if(d
    8) return;
    int tmp=numbers(px,py);
    for(int i=0; i<4; ++i) {
    int x=px+dx[i],y=py+dy[i];
    if(predis[x][y]>0)
    add(tmp+d,tmp+i,predis[x][y]);
    }
    add(tmp+d,numbers(ex,ey)+(d+2)%4,1);
    }
    void spfa(int sx,int sy) {
    int tmp;
    memset(dis,-1,sizeof(dis));
    for(int i=0; i<4; ++i) {
    int x=sx+dx[i],y=sy+dy[i];
    if(predis[x][y]!=-1) {
    tmp=numbers(sx,sy)+i;
    dis[tmp]=predis[x][y];
    que.push(tmp);
    }
    }
    int u;
    while(!que.empty()) {
    u=que.front();
    que.pop();
    vis[u]=false;
    for(int i=head[u]; i; i=e[i].next) {
    int v=e[i].to;
    if(dis[v]==-1 || dis[v]>dis[u]+e[i].w) {
    dis[v]=dis[u]+e[i].w;
    if(!vis[v]) {

    2026-03-24 来自 北京

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页