5.11 每日一题题解

Posted qfnu-acm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.11 每日一题题解相关的知识,希望对你有一定的参考价值。

P1332 血色先锋队

涉及知识点:

  • bfs

solution:

  • (这个题直接用bfs即可,前几天出过bfs的题了,巩固一下)
  • (在一开始将a个传染源读入队列,同时记录感染时间为0)
  • (每次访问上下左右四个节点,如果已经感染则不用再次入队)
  • (这样记录每个点对应的感染时间才是首次被感染的时间)

std:

#include <bits/stdc++.h>

using namespace std;

const int N = 510;

int n,m,a,b;

typedef pair<int,int> PII;

int ans[N][N];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};

queue<PII> q;
vector<PII> v;

void bfs()
{
    while(!q.empty())
    {
        auto t = q.front();
        q.pop();
        for (int i = 0 ; i < 4 ; i ++ )
        {
            int x = t.first+dx[i],y = t.second+dy[i];
            if(x >= 1 && x <= n && y >= 1 && y <= m && ans[x][y] == -1)
            {
                ans[x][y] = ans[t.first][t.second]+1;
                q.push({x,y});
            }
        }
    }
}

int main()
{
    memset(ans,-1,sizeof ans);
    scanf("%d%d%d%d",&n,&m,&a,&b);
    while (a -- )
    {
        int x,y;
        scanf("%d%d",&x,&y);
        q.push({x,y});
        ans[x][y] = 0;
    }
    while (b -- )
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v.push_back({x,y});
    }
    bfs();
    for (auto t : v)
    {
        printf("%d
",ans[t.first][t.second]);
    }
    return 0;
}

以上是关于5.11 每日一题题解的主要内容,如果未能解决你的问题,请参考以下文章

算法·每日一题(详解+多解)-- day14

算法·每日一题(详解+多解)-- day14

寒假每日一题总结(第七天)

寒假每日一题总结(第十五天)

寒假每日一题回文平方(个人练习)详细题解+推导证明(第五天)

Java每日一题——>739. 每日温度(蛮力法,栈方法)