【C++】黑白矩阵(美团)
黑白矩阵(美团)
输入一个n*m的矩阵,改变某些位置上的值后使之成为黑白矩阵(黑白矩阵是矩阵中,任意一个位置上的元素的上下左右的值都两两相等,并且自己和上下左右得值不相等;即矩阵中的某一个元素a[i][j],则有a[i+1][j],a[i-1][j],a[i][j+1],a[i][j-1]这四个元素两两相等且不等于a[i][j]);
输入描述(共 m+2 行):
第一行:输入矩阵的行n
第二行:输入矩阵的列m
第三行:输入m个用空格隔开的数
第四行:输入m个用空格隔开的数
。。。。。。。。。。。。。。。
第n行: 输入m个用空格隔开的数
输出描述(共一行):
第一行:输出需要改变值的元素个数
示例1:
输入:
第一行:3
第二行:3
第四行:1 1 1
第五行:1 1 1
第六行:1 1 1
输出:
第一行:4
示例2:
输入:
第一行:3
第二行:3
第三行:1 1 1
第四行:1 5 1
第六行:1 1 1
输出:
第一行:4
代码演示
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <iterator>
#include <map>
using namespace std;/*黑白矩阵*/
class Funtion
{
public://第一部分,用map表处理,但是由于我对map表值排序的重载函数还没有了解过,所以这部分在写到排序时,我改用了vector来处理;(排序功能待续)void Find_ma(map<int, int>& ma, int val) //操作偶数的函数{map<int, int> ::iterator it = ma.find(val);if (it == ma.end()){ma.insert(make_pair(val, 1));}else{it->second++;}}int deal_ma(map<int, int> even_map, map<int, int> odd_map){int flag = 0, count = 0;map<int, int> ::iterator it1, it2, it1_old, it2_old;it2 = --odd_map.end(); it1 = --even_map.end();if (it1->first != it2->first) //奇偶键不相同就直接返回{return it1->second + it2->second;}if (it1 == even_map.begin() && it2 == odd_map.begin()) //奇偶键相同时的判断{return max(it1->second, it2->second);}if (it1 == even_map.begin()) {return it1->second + (--it2->second);}if (it2 == odd_map.begin()){return it2->second + (--it1->second);}return max(it1_old->second + it2->second, it2_old->second + it1->second); }int blackWhiteMatrix_ma(){int m, n, count;cin >> n >> m; //n行m列if (n == 0 && m == 0) return -1;map<int, int> even_map, odd_map; //第一个容器用来存放偶数,第二个容器用来存放奇数for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){int tmp; cin >> tmp; (i + j) % 2 == 0 ? Find_ma(even_map, tmp) : Find_ma(odd_map, tmp);}}count = deal_ma(even_map, odd_map); return n * m - count; }//第二部分,这部分是用vector来处理的黑白矩阵void Find(vector<pair<int, int>>& ve, int val) //操作偶数的函数{vector<pair<int, int>> :: iterator it = ve.begin();while (1){if (it == ve.end()){ve.push_back(make_pair(val, 1));break;}if (it->first == val){it->second++;break;} it++;}}static bool cmp(pair<int, int> pa1, pair<int, int> pa2){return pa1.second < pa2.second;}int deal(vector<pair<int, int>> even_ve, vector<pair<int, int>> odd_ve){if (odd_ve.empty() && even_ve.empty()) return 0;if (odd_ve.empty()) return (int)even_ve.size();if (even_ve.empty()) return (int)odd_ve.size();sort(even_ve.begin(), even_ve.end(), cmp);sort(odd_ve.begin(), odd_ve.end(), cmp);int flag = 0, count = 0;vector<pair<int, int>> ::iterator it1, it2, it1_old, it2_old;it2 = --odd_ve.end();it1 = --even_ve.end();if (it1->first != it2->first) //奇偶键不相同就直接返回{return it1->second + it2->second;}if (it1 == even_ve.begin() && it2 == odd_ve.begin()) //奇偶键相同时的判断{return max(it1->second, it2->second);}if (it1 == even_ve.begin()){it2--;return it1->second + it2->second;}if (it2 == odd_ve.begin()){it1--;return it2->second + it1->second;}return max(it1_old->second + it2->second, it2_old->second + it1->second);}int blackWhiteMatrix(){int m, n, count; cin >> n >> m; //n行m列 if (n == 0 && m == 0) return -1;vector<pair<int, int>> even_ve, odd_ve;//第一个容器用来存放偶数,第二个容器用来存放奇数for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){int tmp; cin >> tmp;(i + j) % 2 == 0 ? Find(even_ve, tmp) : Find(odd_ve, tmp);}}count = deal(even_ve, odd_ve);return n * m - count;}
};int main()
{Funtion fun;while (1){int count = fun.blackWhiteMatrix();cout << count << endl;}return 0;
}
【C++】黑白矩阵(美团)相关推荐
- 2019美团机器学习/数据挖掘算法实习生笔试 编程题修改矩阵
主要用于交流思考 1.修改矩阵 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C++语言 65536KB:其他语言 589824KB题目描述: 我们称一个矩阵为黑白矩阵 ...
- android 图片过滤,android 图片转为bitmap,黑白镜过滤
图片转bitmap 1.获取图片资源 Bitmap bitmap= BlackWhite(BitmapFactory.decodeResource(getResources(), R.mipmap.t ...
- 2638: 黑白染色
题目链接 题目大意:黑白矩阵,每次可以选择一个四联通块染色,求最少操作次数 题解:将目标状态里相同颜色的联通块缩点,枚举起点,生成树里的最大节点深度就是需要的次数了 如果最大深度是白色的话记得-1 我 ...
- 转载:https://blog.csdn.net/dcrmg/article/details/52939318
张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图) 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下 ...
- 雅礼集训 2017 Day1
T1:loj 6029 市场 题目大意: 维护一个数据结构支持区间加 区间除法 区间求最小值 区间求和 思路: 用线段树维护区间加 区间求最小值 区间和 对于区间除法 注意到除数d很大而加法的w很小 ...
- 牛客网【每日一题】 合集
文章目录 2020年3月25日 NC50439 tokitsukaze and Soldier 牛客练习赛50-C 2020年3月26日 NC13230 合并回文子串 美团2017年CodeM大赛-初 ...
- 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)
from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...
- Tensorflow快餐教程(9) - 卷积
摘要: 卷积的计算方法 卷积 卷积就是滑动中提取特征的过程 在数学中,卷积convolution是一种函数的定义.它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠 ...
- 张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiaomifanhxx/article/details/79560693 使用相机以前,首先要进行相 ...
- 相机标定(2)opencv2实现
相机标定步骤 OpenCV使用棋盘格板进行标定,如下图所示.为了标定相机,我们需要输入一系列三维点和它们对应的二维图像点. 1.在黑白相间的棋盘格上,二维图像点很容易通过角点检测找到. 2.而对于真实 ...
最新文章
- 实例:使用puppeteer headless方式抓取JS网页
- 20170728xlVBA改转置一例
- 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
- 作业 20180925-1 每周例行报告
- DNS的几个基本概念:
- java观察者_Java中的观察者模式
- idea如何打开pom引用依赖_idea 怎么引入在pom.xml的jar
- mysql如何给数据增加tab_怎么往mysql表里添加数据
- android 闹钟布局,Android闹钟UI
- paip.java 架构师之路以及java高级技术
- 申报火热进行中|2021“科创中国”开源创新榜评选
- 如何在excel中创建二级菜单,即选择一个类型后,下一单元格可以选择其子类型
- java 伊甸园_离伊甸园仅一步之遥
- 前端html与css学习笔记总结篇(超详细)
- CentOS7上软RAID的实现
- 阿里云购买域名到icp备案
- 张量学习(1):张量的基本概念
- UCK商学院《当区块链遇见UCK》人物专访——张伟杰:区块链给90后带来新的机遇
- 自考02324离散数学第一章思维导图
- 天气显示服务器不可用,Windows7系统小工具天气不显示提示所在的地区无法使用服务...