您的位置:首页 > 其它

hdu(1728)逃离迷宫

2013-08-15 13:07 302 查看
本题求的是拐弯最少的,可以用优先队列来求。。

只要到达目的地,并且转的弯数小于所要求的即可。。

#include"stdio.h"

#include"string.h"

#include"queue"

char map[110][110];

int visit[110][110];

using namespace std;

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

int n,m,sx,sy,ex,ey,p;

struct point

{

int x,y;

int step;

friend bool operator<(point a,point b)

{

return a.step>b.step;

}

};

int judge(int x,int y)

{

if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]=='.')

return 1;

return 0;

}

int bfs()

{

int i,x,y;

if(sx==ex&&sy==ey)

return 1;

priority_queue<point>q;

point cur,next;

cur.x=sx;

cur.y=sy;

cur.step=-1;

visit[sx][sy]=1;

q.push(cur);

while(!q.empty())

{

next=q.top();

q.pop();

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

{

x=next.x+dir[i][0];

y=next.y+dir[i][1];

while(judge(x,y))//这里把同一个方向一走到底。。

{

if(visit[x][y]==0)

{

cur.x=x;

cur.y=y;

cur.step=next.step+1;

if(x==ex&&y==ey&&cur.step<=p)

return 1;

q.push(cur);

visit[x][y]=1;

}

x=x+dir[i][0];

y=y+dir[i][1];

}

}

}

return 0;

}

int main()

{

int i,j,k;

scanf("%d",&k);

while(k--)

{

scanf("%d%d",&n,&m);

getchar();

memset(visit,0,sizeof(visit));

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

{

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

scanf("%c",&map[i][j]);

getchar();

}

scanf("%d%d%d%d%d",&p,&sy,&sx,&ey,&ex);//小心被坑。。

if(bfs())

printf("yes\n");

else

printf("no\n");

}

return 0;

}

一般队列;

#include"stdio.h"

#include"string.h"

#include"queue"

char map[110][110];

int visit[110][110];

using namespace std;

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

int n,m,sx,sy,ex,ey,p;

struct point

{

int x,y;

int step;

};

int judge(int x,int y)

{

if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]=='.')

return 1;

return 0;

}

int bfs()

{

int i,x,y;

if(sx==ex&&sy==ey)

return 1;

queue<point>q;

point cur,next;

cur.x=sx;

cur.y=sy;

cur.step=-1;

visit[sx][sy]=1;

q.push(cur);

while(!q.empty())

{

next=q.front();

q.pop();

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

{

x=next.x+dir[i][0];

y=next.y+dir[i][1];

while(judge(x,y))

{

if(visit[x][y]==0)

{

cur.x=x;

cur.y=y;

cur.step=next.step+1;

if(x==ex&&y==ey&&cur.step<=p)

return 1;

q.push(cur);

visit[x][y]=1;

}

x=x+dir[i][0];

y=y+dir[i][1];

}

}

}

return 0;

}

int main()

{

int i,j,k;

scanf("%d",&k);

while(k--)

{

scanf("%d%d",&n,&m);

getchar();

memset(visit,0,sizeof(visit));

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

{

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

scanf("%c",&map[i][j]);

getchar();

}

scanf("%d%d%d%d%d",&p,&sy,&sx,&ey,&ex);

if(bfs())

printf("yes\n");

else

printf("no\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: