用vis数组标记到达当前位置的最小时间,如果比最小时间大则不加入队列
#include<stdio.h> #include<queue> #include<string.h> #define inf 0x3fffffff using namespace std; char map[30][30]; int n,m,sx,sy,ex,ey; int cost[4],vis[30][30]; int dir[4][2]={0,1,1,0,0,-1,-1,0}; struct op { int x,y,w; }; int judge(int x,int y) { if(x<0||x>=n||y<0||y>=m||map[x][y]=='@') return 0; return 1; } void bfs() { queue<op>Q; op cur,next; vis[sx][sy]=0;//忘记初始化起点的值,找了好久才找出来 cur.w=0;cur.x=sx;cur.y=sy; Q.push(cur); while(!Q.empty()) { cur=Q.front(); Q.pop(); for(int i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if(judge(next.x,next.y)) { if(map[next.x][next.y]=='#') next.w=cur.w+cost[0]; else if(map[next.x][next.y]=='.') next.w=cur.w+cost[1]; else if(map[next.x][next.y]=='T') next.w=cur.w+cost[2]; if(next.w<vis[next.x][next.y]) {Q.push(next);vis[next.x][next.y]=next.w;} } } } } int main() { int i,j,k,op=1; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) for(j=0;j<m;j++) vis[i][j]=inf; for(i=0;i<3;i++) scanf("%d",&cost[i]); for(i=0;i<n;i++) scanf("%s",map[i]); scanf("%d%d%d%d",&sx,&sy,&ex,&ey); bfs(); if(vis[ex][ey]<inf) k=vis[ex][ey]; else k=-1; printf("Case %d: ",op++); printf("%d\n",k); } return 0; }