样例没过求助
查看原帖
样例没过求助
809729
SJZ2010楼主2023/7/17 08:35

有几行注释是调试用的代码,没过第一个样例

输入:

S..
...
..E

输出:

12

代码如下:

#include <cstdio>
#include <queue>

struct node{
    int dire, x, y, step;
    node(int a, int b, int c, int d){
        dire=a, x=b, y=c, step=d;
    }
};
inline bool operator < (node a, node b){
    return a.step < b.step;
}

std::priority_queue< node > Q;
int n, m, a, b, c, d;
char map[2005][2005],ch;
bool vis[2005][2005][4];

/*
d:
    0:up
    1:left
    2:down
    3:right
*/
const int dy[4]{0,-1,0,1};
const int dx[4]{-1,0,1,0};
inline int bfs(){
    node u(0, 0, 0, 0);
    int x, y, dire, s;
    char mp;
    while(!Q.empty()){
        u=Q.top();
        Q.pop();
        x=u.x, y=u.y, dire=u.dire, s=u.step;
        if(x<1||y<1||x>n||y>m)
            continue;
        mp=map[x][y];
        if(mp=='E')
            return s;
        if(mp=='#'||vis[x][y][dire])
            continue;
        if(mp=='|')
            if(dire==0||dire==2)
                Q.push( node(dire, x+dx[dire], y+dy[dire], s+a) );
            else
                Q.push( node( (dire+1)%4, x+dx[(dire+1)%4], y+dy[(dire+1)%4], s+a ) ),
                Q.push( node( dire-1, x+dx[dire-1], y+dy[dire-1], s+a ) );
        else if(mp=='-')
            if(dire==1||dire==3)
                Q.push( node(dire, x+dx[dire], y+dy[dire], s+a) );
            else{
                int temp=((dire-1)%4+4)%4;
                Q.push( node(temp, x+dx[temp], y+dy[temp], s+a) );
                Q.push( node(dire+1, x+dx[dire+1], y+dy[dire+1], s+a) );
            }
        else if(mp=='/')
            if(dire==0||dire==2){
                int temp=((dire-1)%4+4)%4;
                Q.push( node(temp, x+dx[temp], y+dy[temp], s+b) );
            }else
                Q.push( node((dire+1)%4, x+dx[(dire+1)%4], y+dy[(dire+1)%4], s+b) );
        else if(mp=='\\')
            if(dire==0||dire==2){
                int temp=(dire+1);
                Q.push( node(temp, x+dx[temp], y+dy[temp], s+b) );
            }else
                Q.push( node(dire-1, x+dx[dire-1], y+dy[dire-1], s+b) );
        else if(mp=='.')
            Q.push( node(0, x-1, y, s+c) ),
            Q.push( node(2, x+1, y, s+c) ),
            Q.push( node(1, x, y-1, s+c) ),
            Q.push( node(3, x, y+1, s+c) );
        else if(mp=='S')
            Q.push( node(0, x-1, y, 0) ),
            Q.push( node(2, x+1, y, 0) ),
            Q.push( node(1, x, y-1, 0) ),
            Q.push( node(3, x, y+1, 0) );
        else if(mp=='<'){
            if(dire==1)
                Q.push( node(1, x, y-2, s) );
            else if(dire==0||dire==2)
                Q.push( node(1, x, y-1, s+d) );
        }else if(mp=='>'){
            if(dire==3)
                Q.push( node(3, x, y+2, s) );
            else if(dire==0||dire==2)
                Q.push( node(3, x, y+1, s+d) );
        }else if(mp=='^'){
            if(dire==0)
                Q.push( node(0, x-2, y, s) );
            else if(dire==1||dire==3)
                Q.push( node(0, x-1, y, s+d) );
        }else if(mp=='v'){
            if(dire==2)
                Q.push( node(2, x+2, y, s) );
            else if(dire==1||dire==3)
                Q.push( node(2, x+1, y, s+d) );
        }
        vis[x][y][dire]=1;
        if(mp=='.'||mp=='S')
            vis[x][y][0]=vis[x][y][1]=vis[x][y][2]=vis[x][y][3]=1;
        //printf("%d %d %d %c %d\n", x, y, dire, mp, s);
    }
    return -1;
}
int main(){
    scanf("%d %d %d %d %d %d", &n, &m, &a, &b, &c, &d);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%c", &ch);
            while(ch=='\n'||ch==' ')
                scanf("%c", &ch);
            if(ch=='S')
                Q.push(node(NULL, i, j, 0));
            map[i][j]=ch;
        }
    printf("%d", bfs());
    return 0;
}

在遇到 . 时不知有什么问题,到处乱走。

2023/7/17 08:35
加载中...