WAJUEJI which home strong!

来源:互联网 发布:郭天祥51单片机视频 编辑:程序博客网 时间:2024/04/29 19:43

WAJUEJI which home strong!

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

在一个山沟里,姐弟俩同时考上了大学。但由于家里拮据,所以这并不是什么好消息。父亲对孩子说:我就是砸锅卖铁也要把你们姐俩供出来。 当时的姐姐已经决定放弃上学的机会。 没想到第二天天还没亮,弟弟就偷偷带著几件破衣服和几个乾巴馒头走了,在姐姐枕边留下一个纸条: 姐,你别愁了,考上大学不容易,我出去打工供你。弟。 姐姐握著那张字条,趴在炕上,失声痛哭。 那一年,弟弟17岁,姐姐20岁。 姐姐用父亲满村子借的钱和弟弟在工地裏搬水泥挣的钱终於读到了大三。 一天姐姐正在寝室看书,同学跑进来对姐姐说,有个老乡在找你。姐姐很纳闷,走出去后,远远地看见弟弟,穿著满身是水泥和沙子的工作服。姐姐说,你怎和我同学说你是我老乡啊? 他笑著说,你看我穿的这样,说是你弟,你同学还不笑话你? 姐姐鼻子一酸,眼泪就落了下来。弟弟赶忙为姐姐擦掉眼泪,说:姐,你别哭,我这次来是想让你帮我打听一下,学挖掘机哪家强? 

 

在你的帮助下,弟弟踏上了去蓝翔的路。

那么问题就来了。

输入
第一个数T,T组测试数据。
两个数 n, m; ( 0< n , m <= 100 ) 表示一个h行m列的二维地图。
接下来n行每行m 个字符。
‘s’ 表示弟弟目前所在位置。
‘# ’表示此处为一座山。为了节省体力,不从此处通行。
从‘A’-‘Z’表示各地的经济水平,对应1-26,路过对应字符的地区需要交对应的生活费。
‘l’表示蓝翔技校的所在地。
s 与 l 均为小写字母。
弟弟只能走四个方向。
输出
输出一个数表示弟弟到达蓝翔需要的生活费最小是多少。
如果不能到达,输出 -1。
样例输入
33 5#sVGFA##ZAlCDBC3 3sABABSABl3 3s#B###ABl
样例输出
484-1
第一次代码超时了:
#include <cstdio>#include <cstring>using namespace std;#define min(a,b) a>b?b:aint n,m,k;int book[101][101];char a[101][101];int xy[4][2]={{1,0},{0,1},{-1,0},{0,-1}};void dfs(int i,int j,int t){int tx,ty,p;char A;if (k<t)return;book[i][j]=1;for (p=0;p<4;++p){tx=i+xy[p][0];ty=j+xy[p][1];A=a[tx][ty];if (A!='#'&&!book[tx][ty]&&tx>=0&&tx<n&&ty>=0&&ty<m){if(a[tx][ty]=='l')    {k=min(k,t);return;}dfs(tx,ty,t+A-'A'+1);book[tx][ty]=0;}}}int main(){int N,i,j,x1,y1;scanf("%d",&N);while (N--){k=0x3f3f3f3f;memset(book,0,sizeof(book));scanf("%d %d",&n,&m);for (i=0;i<n;++i){scanf("%s",&a[i]);for (j=0;j<m;++j){if (a[i][j]=='s'){x1=i;y1=j;}}}dfs(x1,y1,0);if(k!=0x3f3f3f3f){printf("%d\n",k);}else{printf("-1\n");}}return 0;}

AC代码:
#include<iostream>#include<queue>#include<cstdio>using namespace std;int n,m;int book[105][105];char a[105][105];int xy[4][2]={{1,0},{0,1},{-1,0},{0,-1}};struct S{int cnt;int x,y;friend bool operator<(S a,S b){return a.cnt>b.cnt;}}t;/*之所以能用优先队列,是因为每次都是在父节点中不断累加可以走的地方要用的钱,而在队列里的元素更改位置是无影响的*/priority_queue<S> str;int jugde(int tx,int ty){if (tx>=0&&tx<n&&ty>=0&&ty<m&&!book[tx][ty]&&a[tx][ty]!='#'){return 1;}return 0;}void bfs(){int tx,ty,k,val,xx,yy,f=1;str.push(t);book[t.x][t.y]=1;while (!str.empty()&&f){t=str.top();str.pop();val=t.cnt;xx=t.x;yy=t.y;for (k=0;k<4&&f;++k){tx=xx+xy[k][0];ty=yy+xy[k][1];if (!jugde(tx,ty))continue;//这里原本写了输出t.cnt,结果WA了几次。想了想后发现若是k不为0时,且能执行以下代码的话,那t.cnt不就变了吗?if(a[tx][ty]=='l'){printf("%d\n",val);f=0;break;}t.x=tx;t.y=ty;t.cnt=val+a[tx][ty]-'A'+1;str.push(t);book[tx][ty]=1;}}if(f)printf("%d\n",-1);}int main(){int N,i,j;scanf("%d",&N);while (N--){scanf("%d %d",&n,&m);for (i=0;i<n;++i){scanf("%s",&a[i]);for (j=0;j<m;++j){book[i][j]=0;if (a[i][j]=='s'){t.x=i;t.y=j;t.cnt=0;}}}bfs();while (!str.empty()){str.pop();}}return 0;}


0 0