首页 > 其他分享 >太阳之华 连通块计数

太阳之华 连通块计数

时间:2024-03-24 13:29:05浏览次数:23  
标签:连通 int ++ 之华 yy 计数 xx ph

C-太阳之华_牛客小白月赛89 (nowcoder.com)

思路:可以发现,最多经过一次操作就能知道结果:

  • 全是蓝色:蓝方胜
  • 全是红色:红方胜
  • 红方经过一次操作:
    • 存在一个连通块扩散等于蓝色个数:红方胜
    • 否则,红蓝一直重复进行,平局

因此,对棋盘进行一次遍历,将所有红色连通块全部找出来并记上标记(类似并查集判定连通块)。之后再对每个连通块扩散吞食掉的蓝块进行计数,由于需要考虑一个连通块中不同红块对同一个蓝块的重复影响,这里用set进行去重。

之后对每个连通块扩散的蓝色个数进行判定即可得到答案。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int fx[] = {0, 0, 1, -1};
int fy[] = {1, -1, 0, 0};
void solve() {
    int n,m; cin>>n>>m;
    vector<string> ph(n);
    vector<vector<int>> rcd(n, vector<int>(m, 0));
    for(auto &t: ph) cin>>t;
    int cnt = 1;
    int cntb = 0;
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            cntb += (ph[i][j] == '.');
        }
    }
    // 全蓝:蓝色胜利
    if(cntb == n * m) {
        cout<<"Blue\n";
        return ;
    }

    // 找到所有的红色联通块
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            if(rcd[i][j]) continue;
            if(ph[i][j] == '#') {
                auto dfs = [&](auto &&self, int x, int y, int id) -> void {
                    rcd[x][y] = id;
                    for(int i = 0; i < 4; ++i) {
                        int xx = x + fx[i], yy = y + fy[i];
                        if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue;
                        if(rcd[xx][yy] || ph[xx][yy] == '.') continue;
                        self(self, xx, yy, id);
                    }
                };
                dfs(dfs, i, j, cnt++);
            }
        }
    }

    // 记录每个红色联通块周围的蓝块数
    set<pair<int,int>> se[cnt];
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            if(ph[i][j] == '.') continue;
            for(int k = 0; k < 4; ++k) {
                int x = i + fx[k], y = j + fy[k];
                if(x < 0 || x >= n || y < 0 || y >= m) continue;
                if(ph[x][y] == '.') se[rcd[i][j]].insert({x, y});
            }
        }
    }

    // 红色联通块周围的蓝色块数等于总蓝色块数:红色胜利
    for(int i = 1; i < cnt; ++i) {
        if(se[i].size() == cntb) {
            cout<<"Red\n";
            return ;
        }
    }
    // 否则,将会一直重复进行,平局
    cout<<"Draw\n";
}
int main()
{
    int t; cin>>t;
    while(t--) {
        solve();
    }
}

标签:连通,int,++,之华,yy,计数,xx,ph
From: https://blog.csdn.net/qq_63432403/article/details/136986279

相关文章

  • 银行监管报送系统介绍(五):金融统计数据大集中自动化报送系统——PBOC Report
    人民银行金融统计数据大集中自动化报送系统(简称PBOCReport),是基于现代计算机网络技术应用基础上,由人行总行设置金融统计数据服务器,建立的一个全国统一的金融统计数据库。人行针对各银行存贷款、中间业务、网点人员、互联网金融等汇总报表统计,贷款类报表较多,从行业、期限、业务......
  • DFS求解连通块问题
    DFS求解连通块问题#include<bits/stdc++.h>usingnamespacestd;charg[35][65];intvis[35][65],num,res;intdx[]={0,1,0,-1},dy[]={1,0,-1,0};voiddfs(intx,inty){if(x<1||x>30||y<1||y>60||g[x][y]=='0'||vis[x][y])return;vis[x][......
  • 7-5 列出连通集
    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个......
  • 蓝桥杯单片机快速开发笔记——利用定时器计数器设置定时器
    一、基本原理        参考本栏http://t.csdnimg.cn/iPHN0二、具体步骤三、主要事项    如果使用中断功能记得打开总中断EA四、示例代码voidTimer0_Isr(void)interrupt1{}voidTimer0_Init(void) //10毫秒@12.000MHz{ AUXR&=0x7F; //定时......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • 十大经典排序之计数排序
    文章目录概要整体架构流程代码实现小结概要计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。整体架构流程(1)找出待排序的数组中最大和最小的元素(2)统计数组中每......
  • proteus+keil5仿真学习笔记(第二章 1位数码管计数器)
    第二章1位数码管计数器目录第二章1位数码管计数器前言一、数码管的结构原理二、按键应用三、中断处理四、程序设计及仿真proteus电路程序总结前言主要介绍数码管、按键的应用,并涉及单片机中断处理技术。一、数码管的结构原理数码管结构如下:有两种数码......
  • proteus+keil5仿真学习笔记(第三章 4位数码管计数器)
    第三章4位数码管计数器前言一、多位数码管显示程序二、定时器原理三、程序设计与仿真proteus电路程序总结前言4位数码管计数器与1位数码管计数器相比,增加了片选电路,以确定选择哪个数码管进行工作。单片机定时器的应用也与中断处理相似,需要设置一些规定的寄存器,以......
  • 基于EP4CE6F17C8的FPGA单数码管秒计数实例
    一、电路模块本例的电路模块与“基于EP4CE6F17C8的FPGA数码管动态显示实例”中的完全一样,此处就不再给出了。二、实验代码本例实现1个数码管循环显示字符1~F,显示间隔为1秒,代码使用Verilog编写,采用例化的形式,共有三个文件。先编写数码管实现显示字形解码的程序,模块名称为seg_de......
  • 计数组合【2024蓝桥杯0基础】-学习笔记
    文章目录计数原理排列数组合数组合数性质例题分析代码复现例题2状态分析代码复现常见的排列组合问题圆排列代码复现第二类斯特林数感悟计数原理排列数组合数组合数性质例题分析代码复现defksm(a,b,c):ans=1%cwhileb!=0:......