Find a way(hdu 2612)

bfs经典题,起点和终点分别bfs,借助于结构体,队列,枚举最后的共同终点所需的步数……


#include<bits/stdc++.h>
using namespace std;
char Map[205][205];
int vis[205][205],n,m,cnt;
int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
struct node
{
    int x;
    int y;
    int step;
};
node path1[1001];
node path2[1001];
void bfs(int x,int y,node path[])
{
    int i;
    memset(vis,0,sizeof(vis));
    queue<node>q;
    node s,e;
    s.x=x,s.y=y,s.step=0;
    q.push(s);
    while(!q.empty())
    {
        s=q.front();
        q.pop();
        if(Map[s.x][s.y]=='@') path[cnt++]=s;
        for(int i=0;i<4;i++)
        {
            int newx=s.x+dir[i][0];
            int newy=s.y+dir[i][1];
            if(newx<0||newy<0||newx>=n||newy>=m) continue;
            if(Map[newx][newy]=='#') continue;
            if(vis[newx][newy]) continue;
            vis[newx][newy]=1;
            e.x=newx,e.y=newy,e.step=s.step+1;
            q.push(e);
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        memset(path1,0,sizeof(path1));
        memset(path2,0,sizeof(path2));
        cnt=0;
        getchar();
        int x1,y1,x2,y2;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                scanf("%c",&Map[i][j]);
                if(Map[i][j]=='Y') x1=i,y1=j;
                if(Map[i][j]=='M') x2=i,y2=j;
            }
            getchar();
        }
        bfs(x1,y1,path1);
        int cnt1=cnt;
        cnt=0;
        bfs(x2,y2,path2);
        int cnt2=cnt;
        int minn=INT_MAX;
        for(int i=0;i<cnt1;i++)
        {
            for(int j=0;j<cnt2;j++)
            {
                if(path1[i].x==path2[j].x&&path1[i].y==path2[j].y)
                    minn=min(minn,11*(path1[i].step+path2[j].step));
            }
        }
        printf("%d\n",minn);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80218804