计蒜客模拟赛(五)第九题

2024-03-29 17:08
文章标签 模拟 第九 计蒜客

本文主要是介绍计蒜客模拟赛(五)第九题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计蒜客模拟赛第九题


在一个 n×m 的方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。

题目
现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆。
输入格式
第一行输两个整数 n, m,用空格隔开。
接下来 n 行,每行输入一个长度为 m 的字符串,表示地图信息。0表示没有炸弹,1表示炸弹。
数据约定:
对于60% 的数据: 1≤n,m≤100;
对于 100% 的数据: 1≤n,m≤1000;
数据量比较大,不建议用cin输入。
输出格式
输出要手动引爆的炸弹数。结论


分析

1.看到这道题我的思路是首先我需要确定炸弹的个数,以及每个炸弹所对应的坐标,由于用到横纵坐标两个参数,所以考虑决定选用结构体构建炸弹的点.
2.根据题目给定的要求需要以字符串,所以决定采用字符数组更为合理,char类型,即输入采用二维数组,根据所给定的m,n进行。
3.对于每一颗炸弹,他均有两个参数,分别是行号和列号,对于所有的炸弹遍历我们将按照,横纵坐标任意一个值相同我们将他们连接起来,然后我们将炸弹形成连通图
题目要求
4.对于不同的炸弹不同的老大大大哥,所以将这些炸弹的大哥哥,放入栈内,最后去重,得到的vector长度即为最终的最优答案


代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;//首先记录  炸弹即 1  存在的位置坐标
#define Max 1000char a[Max][Max];//每行可以容纳的数量
int pre[Max];
int k = 0;struct Node
{int x;int y;
}p[100];//100个炸弹点int find(int x)
{int r = x;while (r != pre[r])r = pre[r];int i = x, j;while (i != r)//路径压缩{j = pre[i]; // 在改变上级之前用临时变量  j 记录下他的值 pre[i] = r; //把上级改为根节点i = j;}return r;
}int main()
{vector<int> elem;int n, m;cin >> n >> m;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> a[i][j];if (a[i][j] == '1')//记录炸弹,并且统计炸弹的个数{k++;p[k].x = i;p[k].y = j;}}}//炸弹的初始化,设置他们的前驱结点均为自己for (int i = 1; i <= k; i++){pre[i] = i;}//如果任意两个炸弹的  横或者纵坐标相同则连接两个点for (int i = 1; i <= k; i++){for (int j = i + 1; j <= k; j++){if (p[i].x == p[j].x || p[i].x == p[j].y){pre[j] = i;}}}//将每个炸弹的大大大哥找到,压入栈内/*记录每个1的坐标然后对相同的坐标进行爆破,行坐标相同直接爆破,纵坐标相同直接爆破*/for (int i = 1; i <= k; i++){elem.push_back(find(i));}//排序sort(elem.begin(), elem.end());elem.erase(unique(elem.begin(), elem.end()),elem.end());//unique()函数将重复的元素放置在最后//erase将重复的第一个元素开始,到最后一个元素开始,全部擦除cout << elem.size() << endl;//数字的种类既是最终的答案/*for (int i = 1; i <= k; i++)//前驱验证{cout << "第" << i << "个的前驱" << pre[i] << endl;}*//*得到最终的炸弹个数*///cout << k << endl;return 0;
}

欢迎大家与我交流,并提出意见和建议,我将进行进一步优化和处理

这篇关于计蒜客模拟赛(五)第九题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859157

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

计蒜客 Skiing 最长路

In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort has MM different ski paths and NN different flags situated at those turning points. The ii-th path from the

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT