您的位置:首页 > 其它

hdu 2757 Ocean Currents(优先队列+bfs)

2013-08-16 18:11 309 查看
小伙伴们真心被这道题惊呆了!刚开始是读题,题目都把小伙伴惊呆了,题目都读不懂!

在前面猴子小伙伴的帮助下,理解了一点点,又偷偷的在纸上写写画画,明白了题意!

后来,你懂的,果断拿下!在拿下的过程也经过一番厮杀,刚开始翻译惊现三十个错误,好吧,慢慢地找啊找,终于消灭所有错误,果断拿测试实例来测试,测试结果对的,果断提交上去,结果一个大大的Wrong Answer,又找啊,发现是自己的visit初始化问题,改了提交,终于出来了个Accepted;

题意:

这题首先给你一个表格,表格有0~7八种不同的数字,每种数字代表由该位置到一个特定的方向,由该位置到该位置上的数所指的方向的走一步,不消耗能量,如果不按该位置数所指的方向走,需消耗一个能量,题目要求求消耗最少的能量由起点到达终点,输出最少能量;

#include<stdio.h>

#include<string.h>
#include<queue>

using namespace std;

#define inf 99999999

struct node

{

int x,y,time;

friend bool operator<(node a,node b)

{

return a.time>b.time;

}

};

char map[1010][1010];

int visit[1010][1010];

int n,m;

int dir[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};

int judge(int x,int y)

{

if(x>=1&&x<=n&&y>=1&&y<=m)

return 1;

return 0;

}

int bfs(int dx,int dy,int sx,int sy)

{

int j,a,b;

node i,o;

priority_queue<node>q;

i.x=dx;i.y=dy;

i.time=0;

q.push(i);

visit[dx][dy]=0;

while(!q.empty())

{

i=q.top();

q.pop();

a=i.x;

b=i.y;

if(a==sx&&b==sy)

return i.time;

for(j=0;j<8;j++)

{

o.x=dir[j][0]+i.x;

o.y=dir[j][1]+i.y;

if(!judge(o.x,o.y))

continue;

if(j==map[i.x][i.y]-'0')

o.time=i.time;

else

o.time=i.time+1;

if(visit[o.x][o.y]>o.time)

{

visit[o.x][o.y]=o.time;

q.push(o);

}

}

}

return 1;

}

int main()

{

int i,j,ans,t,dx,dy,sx,sy;

while(scanf("%d%d",&n,&m)!=EOF)

{

for(i=1;i<=n;i++)

scanf("%s",map[i]+1);

scanf("%d",&t);

while(t--)

{

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

visit[i][j]=inf;

scanf("%d%d%d%d",&dx,&dy,&sx,&sy);

ans=bfs(dx,dy,sx,sy);

printf("%d\n",ans);

}

}

return 0;

}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2757
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: