您的位置:首页 > 产品设计 > UI/UE

NY 1100 WAJUEJI which home strong!

2015-08-15 16:00 274 查看

WAJUEJI which home strong!

[align=center]时间限制:1000 ms | 内存限制:65535 KB[/align]
[align=center]难度:2[/align]
描述
在一个山沟里,姐弟俩同时考上了大学。但由于家里拮据,所以这并不是什么好消息。父亲对孩子说:我就是砸锅卖铁也要把你们姐俩供出来。 当时的姐姐已经决定放弃上学的机会。 没想到第二天天还没亮,弟弟就偷偷带著几件破衣服和几个乾巴馒头走了,在姐姐枕边留下一个纸条: 姐,你别愁了,考上大学不容易,我出去打工供你。弟。 姐姐握著那张字条,趴在炕上,失声痛哭。 那一年,弟弟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

来源流年上传者ACM_安鹏程
思路: 这道题就是一道裸广搜的题,直接用广搜的知识,然后将对应的步数改成对应的数字就OK啦!具体看代码: 代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#define INF 0xfffffff
using namespace std;
int n,m,ans;
char map[105][105];
int x,y,ex,ey;
int vis[105][105];
int fx[4]={0,1,-1,0};
int fy[4]={1,0,0,-1};
struct node
{
int x,y,step;
friend bool operator < (node a,node b)
{
return a.step>b.step;
}
}a,temp;
int judge()
{
if(temp.x<1||temp.x>n)	return 0;
if(temp.y<1||temp.y>m)	return 0;
if(map[temp.x][temp.y]=='#')	return 0;
if(vis[temp.x][temp.y]==1)	return 0;
if(temp.step>=ans)	return 0;
return 1;
}
void bfs()
{
a.x=x;
a.y=y;
a.step=0;
memset(vis,0,sizeof(vis));
vis[x][y]=1;
priority_queue<node>q;
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
for(int i=0;i<4;i++)
{
temp.x=a.x+fx[i];
temp.y=a.y+fy[i];
temp.step=a.step+map[temp.x][temp.y]-'A'+1;
if(judge())
{
if(temp.x==ex&&temp.y==ey)
{
ans=temp.step-('l'-'A'+1);
return;
}
vis[temp.x][temp.y]=1;
q.push(temp);
}
}
}

}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m)
ans=INF;
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='s')
{
x=i;y=j;
}
else if(map[i][j]=='l')
{
ex=i;ey=j;
}
}
}
bfs();
if(ans!=INF)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: