HDU 2612 Find a way 简单BFS

来源:互联网 发布:网络语言粗鄙化的原因 编辑:程序博客网 时间:2024/06/07 01:56

        由于HDU进不去,题目就省了。

        题意:求两个人从Y和M走到同一个@的最短路步数和,#表示墙.表示路。

        解题思路:分别对两个起点进行BFS,然后用两个数组进行每个点的存储,最后暴力扫找到最小值就好了。以下是我的代码

#include <cstdio>#include <iostream>#include <queue>#include <memory.h>#define maxn 205using namespace std;int flag[maxn][maxn];char pic[maxn][maxn];int lenth1[maxn][maxn],lenth2[maxn][maxn];int n,m;int mm[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};struct trip{    int x,y,step;};int check(int x,int y){    if(x<0||x>=n||y<0||y>=m||pic[x][y]=='#') return 1;    return flag[x][y];}int bfs(int r,int s,int lenth[][maxn]){    memset(flag,0,sizeof(flag));    memset(lenth,0,sizeof(lenth));    queue<trip> q;    trip now,next;    now.x=r;    now.y=s;    now.step=0;    flag[r][s]=1;    q.push(now);    while(!q.empty())    {        now=q.front();        q.pop();        for(int i=0; i<4; i++)        {            next.x=now.x+mm[i][0];            next.y=now.y+mm[i][1];            if(check(next.x,next.y)) continue;            next.step=now.step+1;            lenth[next.x][next.y]=next.step;            flag[next.x][next.y]=1;            q.push(next);        }    }}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d%d",&n,&m))    {        int yx,yy,mx,my;        int sum,mm=0x3f3f3f3f;        for(int i=0; i<n; i++)            scanf("%s",pic[i]);        for(int i=0; i<n; i++)            for(int j=0; j<m; j++)            {                if(pic[i][j]=='Y')                {                    yx=i;                    yy=j;                }                if(pic[i][j]=='M')                {                    mx=i;                    my=j;                }            }        bfs(yx,yy,lenth1);        bfs(mx,my,lenth2);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            if(pic[i][j]=='@')        {            sum=lenth1[i][j]+lenth2[i][j];            mm=mm<sum?mm:sum;        }        printf("%d\n",mm*11);    }    return 0;}