当前位置: 首页 > news >正文

1191:流感传染--BFS

这里写目录标题

    • 题目
  • 解析
    • 代码
    • BFS代码

题目

在这里插入图片描述

解析

在同一天对一个病原体进行处理时,如果直接更改数组,将直接影响到后续的遍历

方法一:那么我们可以定义一个数组用来存储坐标vectoir<pair<int,int>>,遍历完所有坐标后,在统一更改感染。

for (auto &p : toInfect) {
            a[p.first][p.second] = '@';
        }

方法二:下述的BFS代码中利用结构体存储该天的感染人的坐标,再while 遍历完所有的坐标

代码

#include <iostream>
#include <vector>
using namespace std;

int n, m, cnt;
char a[110][110];
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};

void check() {
    for (int d = 0; d < m - 1; d++) { // 处理m-1次传播
        vector<pair<int, int> > toInfect;//记录今天会被感染人的坐标
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (a[i][j] == '@') {
                    for (int k = 0; k < 4; k++) {
                        int nx = i + dx[k], ny = j + dy[k];
                        if (nx >= 0 && nx < n && ny >= 0 && ny < n && a[nx][ny] == '.') {
                            toInfect.push_back({nx, ny});
                        }
                    }
                }
            }
        }
        // 统一更新感染
        for (auto &p : toInfect) {
            a[p.first][p.second] = '@';
        }
    }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }
    cin >> m;
    check();
    cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] == '@') cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

BFS代码

#include <iostream>
#include <queue>
using namespace std;

struct Node {
    int x, y, day;  // 坐标和感染时间
};

int n, m;
char grid[110][110];
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};

int bfs() {
    queue<Node> q;
    // 初始化队列:记录所有初始感染者
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (grid[i][j] == '@') {
                q.push({i, j, 1});
            }
        }
    }

    while (!q.empty()) {
        Node node = q.front();
        q.pop();
        if (node.day >= m) continue;  // 超过天数则不传播

        for (int k = 0; k < 4; k++) {
            int nx = node.x + dx[k], ny = node.y + dy[k];
            if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
                // 仅感染健康的人
                if (grid[nx][ny] == '.') {
                    grid[nx][ny] = '@';
                    q.push({nx, ny, node.day + 1});
                }
            }
        }
    }

    // 统计结果
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (grid[nx][ny] == '@') cnt++;
        }
    }
    return cnt;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> grid[i][j];
        }
    }
    cin >> m;
    cout << bfs() << endl;
    return 0;
}

相关文章:

  • 星越L_三角指示牌及危险警示灯使用
  • 【技术支持】记一次mac电脑换行符差异问题
  • Vmware下安装openEuler24.03 LTS
  • 函数指针/逗号表达式/不用if语句完成的字母输出题
  • #mapreduce打包#maven:could not resolve dependencies for project
  • STM32驱动代码规范化编写指南(嵌入式C语言方向)
  • R语言高效数据处理-自定义格式EXCEL数据输出
  • Java 大视界 -- Java 大数据在智能金融资产定价与风险管理中的应用(134)
  • 在windows上通过idea搭建doris fe的开发环境(快速成功版)
  • [Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
  • LeetCode 环形链表II:为什么双指针第二次会在环的入口相遇?
  • 串的KMP算法详解
  • LeetCode[203]移除链表元素
  • 【GPT入门】第21课 langchain核心组件
  • 基于SSM + JSP 的水果蔬菜商城
  • 【C++】每日一练(轮转数组)
  • SSL/TLS 1.2过程:Client端如何验证服务端证书?
  • CentOS 8 停止维护后通过 rpm 包手动安装 docker
  • MIDI,AI 3D场景生成技术
  • Java中的访问修饰符有哪些
  • 网站建设启凡/搜索排名广告营销
  • 落实网站建设培训班精神/优化seo
  • 彩票网站维护需要几天/电商平台排行榜前十名
  • 真人性做爰 video网站/上海品牌推广公司
  • 网站数据泄露我们应该怎么做/郑州网络运营培训
  • 怎样看一个网站是哪个公司做的/郑州seo学校