您的位置:首页 > 其它

hdu 2822 Dogs(bfs+优先队列)

2013-08-16 18:56 267 查看
和上道2757差不多啦,嘿嘿!!!一次过!!!

算水吧!!!

#include<stdio.h>

#include<string.h>

#include<queue>

using namespace std;

#define inf 999999999

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 dir[4][2]={1,0,0,1,-1,0,0,-1};

int n,m;

int judge(int x,int y)

{

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

return 1;

return 0;

}

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

{

priority_queue<node>q;

node in,out;

int i;

visit[sx][sy]=0;

in.x=sx;

in.y=sy;

in.time=0;

q.push(in);

while(!q.empty())

{

in=q.top();

q.pop();

if(in.x==dx&&in.y==dy)

return in.time;

for(i=0;i<4;i++)

{

out.x=in.x+dir[i][0];

out.y=in.y+dir[i][1];

if(judge(out.x,out.y))

{

if(map[out.x][out.y]=='X')

out.time=in.time;

else

out.time=in.time+1;

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

{

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

q.push(out);

}

}

}

}

return 1;

}

int main()

{

int x0,y0,x1,y1,i,j,ans;

while(scanf("%d%d",&n,&m),n+m)

{

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

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

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

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

visit[i][j]=inf;

scanf("%d%d%d%d",&x0,&y0,&x1,&y1);

ans=bfs(x0,y0,x1,y1);

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

}

return 0;

}

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