问题 D: 我要上蓝翔
时间限制: 1 Sec 内存限制: 128 MB提交: 68 解决: 22
[ 提交][ 状态][ 讨论版]
题目描述
废话不多说,我要上蓝翔。
‘s’ 表示起始所在位置。
‘# ’表示此处为一座山。为了节省体力,不从此处通行。
从‘A’-‘Z’表示各地的经济水平,对应1-26,路过对应字符的地区需要交对应的生活费。
‘l’表示蓝翔技校的所在地。
s 与 l 均为小写字母。
问最少消费是多少
输入
输入包括多组测试数据,每组两个数 n, m; ( 0< n , m <= 100 ) 表示一个h行m列的二维地图。
接下来n行每行m 个字符。
输出
如果不能到达,输出 -1。
样例输入
3 5 #sVGF A##ZA lCDBC
样例输出
48
//要特别注意相邻的情况就好了,参考代码如下:#include<stdio.h> #include<queue> #include<string.h> #include<algorithm> using namespace std; char mp[110][110]; int m,n; int ex,ey,bx,by; int flag; int dx[4]={1,-1,0,0}; int dy[4]={0, 0,-1,1}; int vis[110][110]; struct node { int x,y,w; friend bool operator<(node a,node b) {return a.w>b.w; } }a,b; int jud(int x,int y) { if(b.x<0||b.y<0||b.x>=m||b.y>=n) return 0; if(vis[b.x][b.y]||mp[b.x][b.y]=='#') return 0; return 1; } int bfs(int x,int y) { a.x=x; a.y=y; a.w=0; memset(vis,0,sizeof(vis)); priority_queue<node>q; vis[a.x][a.y]=1; q.push(a); flag=0; while(!q.empty()) { a=q.top(); q.pop(); if(a.x==ex&&a.y==ey) {flag=1; return a.w; } for(int i=0;i<4;i++) { b.x=a.x+dx[i]; b.y=a.y+dy[i]; if(jud(b.x,b.y)) { if(mp[b.x][b.y]>='A'&&mp[b.x][b.y]<='Z') b.w=a.w+mp[b.x][b.y]-'A'+1; else b.w=a.w+0; vis[b.x][b.y]=1; q.push(b); } } } } int main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF) { for(j=0;j<n;j++) { getchar(); for(i=0;i<m;i++) { scanf("%c",&mp[i][j]); if(mp[i][j]=='s') bx=i,by=j; if(mp[i][j]=='l') ex=i,ey=j; } } int k=bfs(bx,by); if(flag) printf("%d\n",k); else printf("-1\n"); } return 0; }