给出一个地图,地图有四种路面,经过每种路面花费的时间不同,问从起点到终点所花费的最少时间是多少
把到各个点的花费存入队列中,然后弹出,即可得到最小
Sample Input
4 6
1 2 10
T...TT
TTT###
TT.@#T
..###@
0 1 3 0
4 6
1 2 2
T...TT
TTT###
TT.@#T
..###@
0 1 3 0
2 2
5 1 3
T@
@.
0 0 1 1
Sample Output
Case 1: 14
Case 2: 8
Case 3: -1
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int x,y,v1,v2,v3,b,n,m; int x1,x2,y1,y2; int p[25][25]; int vis[25][25]; int v[5]; int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; struct node { int x,y,step; friend bool operator < (node a,node b) { return a.step > b.step; } }; bool judge(int x,int y) { if(x < 0 || y < 0 || x >= n || y >= m || p[x][y] < 0 || vis[x][y]) return false; return true; } int work() { priority_queue<node>que; node a,b; a.x=x1; a.y=y1; a.step = 0; que.push(a); memset(vis,0,sizeof(vis)); vis[x1][y1] = 1; while(!que.empty()) { a = que.top(); que.pop(); if(a.x == x2 && a.y == y2) return a.step; for(int i = 0;i < 4;i++) { b = a; b.x += dir[i][0]; b.y += dir[i][1]; if(!judge(b.x,b.y)) continue; b.step += v[p[b.x][b.y]]; vis[b.x][b.y] = 1; que.push(b); } } return -1; } int main() { int i,j,cas = 1; char s[1000]; while(~scanf("%d%d",&n,&m)) { scanf("%d%d%d",&v[3],&v[2],&v[1]); for(i = 0; i < n; i++) { scanf("%s",s); for(j = 0;s[j]; j++) { if(s[j]=='T') p[i][j] = 1; else if(s[j] == '.') p[i][j] = 2; else if(s[j] == '#') p[i][j] = 3; else if(s[j] == '@') p[i][j] = -1; } } scanf("%d%d%d%d",&x1,&y1,&x2,&y2); int ans = work(); printf("Case %d: %d ",cas++,ans); } return 0; }