有几行注释是调试用的代码,没过第一个样例
输入:
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;
}
在遇到 . 时不知有什么问题,到处乱走。