WAJUEJI which home strong!
-
描述
-
在一个山沟里,姐弟俩同时考上了大学。但由于家里拮据,所以这并不是什么好消息。父亲对孩子说:我就是砸锅卖铁也要把你们姐俩供出来。 当时的姐姐已经决定放弃上学的机会。 没想到第二天天还没亮,弟弟就偷偷带著几件破衣服和几个乾巴馒头走了,在姐姐枕边留下一个纸条: 姐,你别愁了,考上大学不容易,我出去打工供你。弟。 姐姐握著那张字条,趴在炕上,失声痛哭。 那一年,弟弟17岁,姐姐20岁。 姐姐用父亲满村子借的钱和弟弟在工地裏搬水泥挣的钱终於读到了大三。 一天姐姐正在寝室里看书,同学跑进来对姐姐说,有个老乡在找你。姐姐很纳闷,走出去后,远远地看见弟弟,穿著满身是水泥和沙子的工作服。姐姐说,你怎么和我同学说你是我老乡啊? 他笑著说,你看我穿的这样,说是你弟,你同学还不笑话你? 姐姐鼻子一酸,眼泪就落了下来。弟弟赶忙为姐姐擦掉眼泪,说:姐,你别哭,我这次来是想让你帮我打听一下,学挖掘机哪家强?
在你的帮助下,弟弟踏上了去蓝翔的路。
那么问题就来了。
-
输入
- 第一个数T,T组测试数据。
两个数 n, m; ( 0< n , m <= 100 ) 表示一个h行m列的二维地图。
接下来n行每行m 个字符。
‘s’ 表示弟弟目前所在位置。
‘# ’表示此处为一座山。为了节省体力,不从此处通行。
从‘A’-‘Z’表示各地的经济水平,对应1-26,路过对应字符的地区需要交对应的生活费。
‘l’表示蓝翔技校的所在地。
s 与 l 均为小写字母。
弟弟只能走四个方向。
输出 - 输出一个数表示弟弟到达蓝翔需要的生活费最小是多少。
如果不能到达,输出 -1。
样例输入 -
3 3 5 #sVGF A##ZA lCDBC 3 3 sAB ABS ABl 3 3 s#B ### ABl
样例输出 -
48 4 -1
- 第一个数T,T组测试数据。
额....挖掘机哪家强.........
扯完之后,做题.....
这个题是一个典型的搜索题目,需要找到最少的花费,也就相当于要找到最短的路径,bfs+优先队列,因为每条路对应的价钱可能不一样,所以需要用优先队列来优先考虑花费最少的那条路,另外,在处理的时候,注意界限的控制和条件的判断.....
另外做这种题,有个小技巧,因为有的题可能有多个起点或者多个终点,但是会有唯一一个终点或起点,那么就优先考虑这个唯一的点,搜索找对应的点就行了,否则不一定是最优解.......
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int v[105][105],n,m;
int fx[4]={-1,0,0,1},fy[4]={0,-1,1,0}; //四个方向
char x[105][105];
struct lu
{
int x,y,m;
friend bool operator<(lu a,lu b) //便宜的优先
{
return a.m>b.m;
}
}st,tp;
void bfs(int a,int b)
{
priority_queue<lu> q;
st.x=a;st.y=b;st.m=0;
q.push(st);v[a][b]=1; //首元素入队
while(!q.empty()) //
{
st=q.top();q.pop(); //取队首
if(x[st.x][st.y]=='s')
{
printf("%d\n",st.m-'s'+'A'-1); //因为每次都提前加了当前位置的字母,所以要减去
return;
}
for(int i=0;i<4;++i)
{
int tx=st.x+fx[i],ty=st.y+fy[i]; //方向
if(tx<0||tx>n-1||ty<0||ty>m-1||x[tx][ty]=='#') //不能入队
{
continue;
}
if(!v[tx][ty])
{
v[tx][ty]=1; //标记状态
tp.x=tx;tp.y=ty;
tp.m=st.m+x[tx][ty]-'A'+1; //累加费用
q.push(tp);
}
}
}
printf("-1\n"); //队空未跳出证明不能达到要求
}
int main()
{
int t,i,j,a,b;char s;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;++i)
{
getchar(); //注意格式
for(j=0;j<m;++j)
{
scanf("%c",&s);
x[i][j]=s;
if(s=='l') //找到终点
{
a=i,b=j;
}
}
}
memset(v,0,sizeof(v));
bfs(a,b);
}
}