小A与小B (双向bfs)

小A与小B

https://ac.nowcoder.com/acm/problem/23486

双向搜索,bfs,用pair来存储坐标方便很多
由于d要走两次,不太方便,所以我们直接bfs两次就好了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn = 1e6+6;
int n, m;
char a[1010][1010];
bool vis[2][1010][1010];
queue<PII> q[2]; 
int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};

int vans = 0;
int nans = 0;

bool bfs(int x)
{
    int size = q[x].size();        //先记录队列长度
    while(size --)                //当队列不为0
    {
        PII p = q[x].front();    //将队列第一个取下
        q[x].pop();            //删除第一个
        for(int k = 0; k < (x?4:8); k ++)    //遍历第一个能到的点,然后插入对列
        {
            int dx = p.first + dir[k][0];
            int dy = p.second + dir[k][1];
            if(dx>0&&dx<=n&&dy>0&&dy<=m&&a[dx][dy]!='#'&&!vis[x][dx][dy])
            {
                if(vis[x^1][dx][dy] == 1) return 1;//这里的异或很奇妙
                vis[x][dx][dy] = 1;
                q[x].push(make_pair(dx,dy));
            }
        }
    }
    return 0;
}

int solve()
{
    int res = 0;  //记录走了几次
    while(!q[0].empty()||!q[1].empty()) //只要两个队列有一个不空
    {
        res ++;
        if(bfs(0)) return res; //如果走的位置,另一个已经走过了返回次数
        if(bfs(1)) return res;
        if(bfs(1)) return res;
    }
    return -1; //如果最后都没有相遇返回-1
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            cin >> a[i][j];
            if(a[i][j] == 'C')
            {
                q[0].push(make_pair(i,j)); //用pair类型存点
            }
            if(a[i][j] == 'D')
            {
                q[1].push(make_pair(i,j));//用pair存 
            }
        }
    }
    int ans = solve();

    if(ans == -1) printf("NO\n");
    else
    {
        printf("YES\n");
        printf("%d\n",ans);
    }

    return 0;
}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务