HDU2612 BFS优化

来源:互联网 发布:数控线切割编程视频 编辑:程序博客网 时间:2024/06/05 15:31

简单BFS。但是很容易超时

以下贴上TLE和AC 的代码

AC:(别人的代码)

#include <iostream>#include <algorithm>#include <queue>#include <string.h>using namespace std;char map[202][202];//地图int a[202][202];//保存第一个人Y到各个节点(坐标)的最小步数,有的节点不用访问,下面有说明int b[202][202];//保存第二个人Mint dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};//方向int n,m;//地图大小int yx,yy,mx,my;//Y的坐标,M的坐标void getmap()//输入地图{    for(int i=0;i<n;i++)        for(int j=0;j<m;j++)    {        cin>>map[i][j];        if(map[i][j]=='Y')        {            yx=i;            yy=j;        }        else if(map[i][j]=='M')        {            mx=i;            my=j;        }    }}//开始先记录出发的位置,直接从已知点出发,不用多次遍历。//这样也是从X Y出发的好处,方便记录坐标,应该从数量少的地方出发struct node{    int x,y;};void bfs(int x,int y,int num[202][202])//广搜{    queue<node>q;    node aa,bb;    aa.x=x;    aa.y=y;    num[x][y]=0;    q.push(aa);    while(!q.empty())    {        bb=q.front();        q.pop();        for(int i=0;i<4;i++)        {            aa.x=bb.x+dx[i];            aa.y=bb.y+dy[i];            if(aa.x>=0&&aa.x<n&&aa.y>=0&&aa.y<m&&num[aa.x][aa.y]==0&&map[aa.x][aa.y]!='#')            {                num[aa.x][aa.y]=num[bb.x][bb.y]+1;//记录步数的方法。同时走过的地方也不用再做标记                q.push(aa);            }        }    }}int main(){    while(cin>>n>>m)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        getmap();        bfs(yx,yy,a);        bfs(mx,my,b);        int minn=1000000;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            if(map[i][j]=='@'&&b[i][j]!=0)//必须保证此处@被访问过!写成a[i][j]!=0也可以            {                minn=min(minn,a[i][j]+b[i][j]);//某个KFC地点两者到达的总步数之和,取最小值。每次求一次较小值            }        }        cout<<minn*11<<endl;    }    return 0;}

TLE:

#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=40000+50;int cnt,line,col;char maze[300][300],BLOCK='#';int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};inline bool is_legal(int x,int y,char t){    return x>0&&y>0&&x<=col&&y<=line&&t!=BLOCK;}int bfsM(int x,int y){    int step=0,nx,ny;    char mazeM[300][300];     for(int i=1;i<=line;i++)        for(int j=1;j<=col;j++)            mazeM[i][j]=maze[i][j];    pair<int,int>path[300][300];    queue<pair<int,int> >q;    q.push(make_pair(x,y));    path[x][y]=make_pair(-1,-1);    mazeM[x][y]=BLOCK;    while(!q.empty())    {        pair<int,int>fa=q.front();        q.pop();        for(int i=0;i<4;i++)        {             nx=dx[i]+fa.first,ny=dy[i]+fa.second;            if(!is_legal(nx,ny,mazeM[nx][ny])) continue;            path[nx][ny]=fa;            if(mazeM[nx][ny]=='M') goto end2;            q.push(make_pair(nx,ny));            mazeM[nx][ny]=BLOCK;        }    }    end2:int x1=nx,y1=ny;    while(x1!=-1)    {        int nx=path[x1][y1].first; int ny=path[x1][y1].second;        x1=nx;y1=ny;        step++;    }    return step-1;}int bfsY(int x,int y){    int step=0,nx,ny;    char mazeY[300][300];     for(int i=1;i<=line;i++)        for(int j=1;j<=col;j++)            mazeY[i][j]=maze[i][j];    pair<int,int>path[300][300];    queue<pair<int,int> >q;    q.push(make_pair(x,y));    path[x][y]=make_pair(-1,-1);    mazeY[x][y]=BLOCK;    while(!q.empty())    {        pair<int,int>fa=q.front();        q.pop();        for(int i=0;i<4;i++)        {            nx=dx[i]+fa.first,ny=dy[i]+fa.second;            if(!is_legal(nx,ny,mazeY[nx][ny])) continue;            path[nx][ny]=fa;            if(mazeY[nx][ny]=='Y') goto end1;            q.push(make_pair(nx,ny));            //debug            //printf("nx:%d ny:%d\n",nx,ny);            //printf("%c\n",mazeY[nx][ny]);            mazeY[nx][ny]=BLOCK;        }    }    end1:int x1=nx,y1=ny;    while(x1!=-1)    {        int nx=path[x1][y1].first; int ny=path[x1][y1].second;        x1=nx;y1=ny;        step++;    }    return step-1;}int main(){    int stepY,stepM,stepS[maxn];    while(scanf("%d%d",&line,&col)!=EOF)    {        cnt=0;        memset(maze,0,sizeof(maze));        for(int i=1;i<=line;i++)            scanf("%s",&maze[i][1]);    for(int i=1;i<=line;i++)        for(int j=1;j<=col;j++)            if(maze[i][j]=='@')    {            stepY=bfsY(i,j);            stepM=bfsM(i,j);            //printf("Y:%d M:%d\n",stepY,stepM);            stepS[cnt++]=stepM+stepY;    }    sort(stepS,stepS+cnt);    printf("%d\n",stepS[0]*11);}    return 0;}


原创粉丝点击