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

补题:J. Robot Factory

传送门:Problem - 1600J - Codeforces

题意:给定一个二维矩阵,每个矩阵中的元素均为 [ 0, 15 ]的范围内,每个矩阵中的元素二进制位上为1时,就代表一堵墙(不能通过),求二维矩阵联通块大小从大到小排列

思路:( dfs )

由于元素是有限的,并且范围很小,于是可以先预处理每个元素的二进制位

在通过 dfs 处理出来每个联通快的大小

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e3 + 10;
bool vis[N][N];
int dx[4] = { 0 , 1 , 0 , -1 };
int dy[4] = { -1 , 0 , 1 , 0 }; // 这个要对齐,是 北 东 南 西 ,因为要和元素的二进制对应
int d[16][4];
int cnt; int n, m;
void dfs(vector<vector<int>>& a, int x, int y)
{
    vis[x][y] = true;
    cnt++;
    for (int i = 0; i < 4; i++)
    {
        int xx = x + dx[i]; int yy = y + dy[i];
        if (xx <= 0 || yy <= 0 || xx > n || yy > m || d[a[x][y]][i] || vis[xx][yy])continue;
        dfs(a, xx, yy);
    }
}
void solve()
{
    cin >> n >> m;
    memset(vis, 0, sizeof vis);
    vector<vector<int>> a(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) cin >> a[i][j];
    priority_queue<int> heap;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (!vis[i][j])
            {
                cnt = 0;
                dfs(a, i, j);
                heap.push(cnt);
            }
    while (heap.size())
    {
        cout << heap.top() << " "; heap.pop();
    }
    cout << endl;
}
signed main()
{
    for (int i = 0; i < 16; i++)
        for (int j = 0; j < 4; j++)
            if (i >> j & 1) d[i][j] = 1;
    int tt = 1;
    while (tt--)solve();
    return 0;
}


http://www.kler.cn/news/355388.html

相关文章:

  • 2025选题推荐|基于微信小程序的高校就业招聘系统
  • NumPy 数组操作:从入门到精通
  • Ping百度,出现“ping:baidu.com: Temporary failure in name resolution“解决方案
  • 前端开发攻略---使用css实现滚动吸附效果
  • tortoisegit简单用法
  • 图像识别技术的多领域应用:从医疗到安防
  • 【LeetCode 88. 合并两个有序数组】 java实现
  • 无人机集群路径规划:5种优化算法(SFOA、APO、GOOSE、CO、PIO)求解无人机集群路径规划,提供MATLAB代码
  • 操作系统学习笔记-1.1操作系统的基本概念
  • 抖音大模型面试经历分享
  • docker搭建 Rancher开源的 Kubernetes管理平台
  • C语言中的文件操作:从基础到深入底层原理
  • Blob 学习指南:从零开始学习 JavaScript Blob 对象的使用
  • Ubuntu 安装 nginx
  • 【RS】GEE(Python):基础知识与环境搭建
  • 第二十三篇——解析几何:用代数的方法解决更难的几何题
  • C++AVL树的介绍和实现
  • ROS2 通信三大件之动作 -- Action
  • Oracle漏洞修复 19.3 补丁包 升级为19.22
  • React路由 基本使用 嵌套路由 动态路由 获取路由参数 异步路由 根据配置文件来生成路由