HDU 1728(BFS)

来源:互联网 发布:php会员管理系统模板 编辑:程序博客网 时间:2024/06/14 18:10

点击打开链接


注意本题要求的是最小拐弯数,如果按照平常的做饭来,每次走过之后就把该点的mark值记为1,以后就不能在走了,但是之后可能出现拐弯数较小的。

比如

000000

011110

001000

100011

可能通过红色到绿色,也可能通过蓝色,但是明显通过红色先到,但是蓝色的拐弯少!!

注意输入的顺序!


#include"stdio.h"#include"string.h"#include"queue"using namespace std;int map[101][101];char str[101][101];int n,m,ex,ey,sx,sy,T,step;int d[4][2]={{0,1},{-1,0},{1,0},{0,-1}};struct node{    int x,y,step,dir;};void bfs(){    memset(map,50,sizeof(map));    queue<node>Q;    node q,p;    int k;    q.x=sx;    q.y=sy;    q.step=0;    q.dir=-1;    map[q.x][q.y]=0;    Q.push(q);    while(!Q.empty())    {        q=Q.front();        Q.pop();        for(k=0;k<4;k++)        {            p=q;            p.x+=d[k][0];            p.y+=d[k][1];            if(p.x>=n||p.x<0||p.y>=m||p.y<0||str[p.x][p.y]=='*')                continue;            if(p.dir!=k&&p.dir!=-1)                p.step++;            if(p.step>step)                continue;            if(p.x==ex&&p.y==ey)            {                printf("yes\n");                return ;            }            if(map[p.x][p.y]>=p.step)            {                p.dir=k;                map[p.x][p.y]=p.step;                Q.push(p);            }        }    }    printf("no\n");    return ;}int main(){    int i;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        for(i=0;i<n;i++)            scanf("%s",str[i]);        scanf("%d %d %d %d %d",&step,&sy,&sx,&ey,&ex);        sx--;sy--;ex--;ey--;        if(sx==ex&&sy==ey)        {            printf("yes\n");            continue;        }        else            bfs();    }    return 0;}



原创粉丝点击