HDU 2612 find a way (kuangbin带你飞 专题一:简单搜索)

题意:有两个人Y和M,约定好了再kfc碰面,问两个人碰面的最短时间是多少..

先对Y能达到的所有地方bfs一边记录最短路程存起来,在对Mbfs一边,然后对于kfc这个地方把两个人的最短时间加起来找最小就好了....

注意:有些kfc可能无法到达..so....要判断一下

#include
#include
#include
#include
#include
#include
using namespace std;
int used[233][233][2];//标记是否经过这个点并且记录是第几个人、时间多少
char map[233][233];
int n,m;
struct node
{
    int x,y,t;
};
int d[4][2]={1,0,-1,0,0,1,0,-1};
bool ok(int x,int y,int r)
{
    if(x<0||y<0||x>=n||y>=m)
        return false;
    if(map[x][y]=='#'||used[x][y][r]!=-1)
        return false;
    return true;
}
void bfs(int x,int y,int r)
{
    queue q;
    node now,next;
    now.x=x,now.y=y,now.t=0;
    used[x][y][r]=0;
    q.push(now);
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            next.x=now.x+d[i][0];
            next.y=now.y+d[i][1];
            if(ok(next.x,next.y,r))
            {
                next.t=now.t+1;
                used[next.x][next.y][r]=next.t;
                q.push(next);
            }
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        for(int i=0;iused[i][j][0]+used[i][j][1]&&(used[i][j][0]>-1&&used[i][j][1]>-1))//需要判断一下这个kfc能不能走到
                        mini=used[i][j][0]+used[i][j][1];
                }
            }
        }
        cout<


你可能感兴趣的:(搜索)