BFS.p.2312通关

从入口到出口,墙需要的时间不一样

BFS先是用了for循环写,然而超时

所以在网上找到了用queue写的BFS,并不理解为什么我的超时

#include <iostream>

#include <stdio.h>

using namespacestd;

char map[305][305];

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

int m,n,endx,endy,beginx,beginy,ok,tim,flag[305][305],f;

int check()

{

    for(int i=0;i<m;i++)

        for(int j=0;i<n;j++)

        {

            if(map[i][j]=='E'||map[i][j]=='B')

            {

                if(flag[i][j]==0)

                    return1;

            }

        }

    return0;

}

void BFS(int x,int y,int t)

{

    if(map[x][y]=='T')

    {

        if(t<tim)

            tim=t;

        return;

    }

    if(check()==0)

        return;

    flag[x][y]=1;

    int xx,yy;

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

    {

        xx=x+turn[i][0];

        yy=y+turn[i][1];

        //printf("xx=%d yy=%d c=%c ",xx,yy,map[xx][yy]);

        if(xx<0||xx>=m||yy<0||yy>=n||flag[xx][yy]==1)

            continue;

        if(map[xx][yy]=='B')

            BFS(xx,yy,t+2);

        elseif(map[xx][yy]=='E'||map[xx][yy]=='T')

            BFS(xx,yy,t+1);


    }

    flag[x][y]=0;

}

int main()

{

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

    {

        getchar();

        if(m==0&&n==0)

            break;

        for(int i=0;i<m;i++)

        {

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

            for(int j=0;j<n;j++)

            {

                if(map[i][j]=='Y')

                {

                    beginx=i;

                    beginy=j;

                }

            }

        }

        f=0;

        tim=1000000;

        memset(flag,0,sizeof(flag));

        BFS(beginx,beginy,0);

        if(tim==1000000)

            printf("-1\n");

        else

            cout <<tim<<endl;

    }

    

    return0;

}

*****************分割线*****************

#include<iostream>

#include<cstdio>

#include<queue>

using namespacestd;

struct point

{

    int x,y;

    int steps;

};

char map[301][301];

int visit[301][301],b[4][2]={-1,0,1,0,0,-1,0,1};

int bfs(point start,point end,int n,int m)

{

    int x,y,i;

    point e;

    queue <point> Q;

    Q.push(start);

    visit[start.x][start.y]=1;

    while(!Q.empty())

    {

        e=Q.front();

        if(e.x==end.x && e.y==end.y)

            break;

        Q.pop();

        if(map[e.x][e.y]=='B')

        {

            e.steps++;

            map[e.x][e.y]='E';

            Q.push(e);

            continue;

        }

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

        {

            x=e.x+b[i][0]; y=e.y+b[i][1];

            if(x>=0 && x<n && y>=0 && y<m && !visit[x][y])

            {

                if(map[x][y]=='E' ||map[x][y]=='B' ||map[x][y]=='T')

                {

                    point ee={x,y,e.steps+1};

                    Q.push(ee);

                    visit[x][y]=1;

                }

            }

        }

    }

    if(!Q.empty())return e.steps;

    return -1;

}

int main()

{

    int m,n,i,j;

    point start,end;

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

    {

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

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

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

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

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

                if(map[i][j]=='Y')

                {

                    start.x=i; start.y=j; start.steps=0;

                }

                elseif(map[i][j]=='T')

                {

                    end.x=i; end.y=j; end.steps=0;

                }

        printf("%d\n",bfs(start,end,n,m));

    }

    return0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值