【ACWing】728. 变身程序员

题目地址:

https://www.acwing.com/problem/content/description/730/

公司的程序员不够用了,决定把产品经理都转变为程序员以解决开发时间长的问题。在给定的矩形网格中,每个单元格可以有以下三个值之一:
0 0 0代表空单元格;
1 1 1代表产品经理;
2 2 2代表程序员;
每分钟,任何与程序员(在 4 4 4个正方向上)相邻的产品经理都会变成程序员。返回直到单元格中没有产品经理为止所必须经过的最小分钟数。如果不可能,返回 − 1 −1 1。以下是一个 4 4 4分钟转变完成的示例:

2 1 1      2 2 1      2 2 2      2 2 2      2 2 2
1 1 0  ->  2 1 0  ->  2 2 0  ->  2 2 0  ->  2 2 0
0 1 1      0 1 1      0 1 1      0 2 1      0 2 2

输入格式:
不固定多行(行数不超过 10 10 10),毎行是按照空格分割的数字(不固定,毎行数字个数不超过 10 10 10)。
其中每个数组项的取值仅为 0 0 0 1 1 1 2 2 2三种。
读取时可以按行读取,直到读取到空行为止,再对读取的所有行做转换处理。

输出格式:
如果能够将所有产品经理变成程序员,则输出最小的分钟数。
如果不能够将所有的产品经理变成程序员,则返回 − 1 −1 1

多源BFS。代码如下:

#include <iostream>
#include <sstream>
using namespace std;
using PII = pair<int, int>;

int m, n;
int a[15][15];
PII q[110];

int main() {
  string s;
  while (getline(cin, s)) {
    stringstream ss(s);
    n = 0;
    while (ss >> a[m][n++]);
    m++;
  }

  int hh = 0, tt = 0;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 2) q[tt++] = {i, j};

  int d[] = {-1, 0, 1, 0, -1};
  int res = 0;
  while (hh < tt) {
    res++;
    for (int i = tt - hh; i; i--) {
      auto [x, y] = q[hh++];
      for (int k = 0; k < 4; k++) {
        int nx = x + d[k], ny = y + d[k + 1];
        if (0 <= nx && nx < m && 0 <= ny && ny < n && a[nx][ny] == 1) {
          a[nx][ny] = 2;
          q[tt++] = {nx, ny};
        }
      }
    }
  }

  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == 1) {
        puts("-1");
        return 0;
      }

  printf("%d\n", res - 1);
}

时空复杂度 O ( m n ) O(mn) O(mn) m , n m,n m,n分别是行数和列数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值