黑白矩阵(美团)

输入一个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++】黑白矩阵(美团)相关推荐

  1. 2019美团机器学习/数据挖掘算法实习生笔试 编程题修改矩阵

    主要用于交流思考 1.修改矩阵 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C++语言 65536KB:其他语言 589824KB题目描述: 我们称一个矩阵为黑白矩阵 ...

  2. android 图片过滤,android 图片转为bitmap,黑白镜过滤

    图片转bitmap 1.获取图片资源 Bitmap bitmap= BlackWhite(BitmapFactory.decodeResource(getResources(), R.mipmap.t ...

  3. 2638: 黑白染色

    题目链接 题目大意:黑白矩阵,每次可以选择一个四联通块染色,求最少操作次数 题解:将目标状态里相同颜色的联通块缩点,枚举起点,生成树里的最大节点深度就是需要的次数了 如果最大深度是白色的话记得-1 我 ...

  4. 转载:https://blog.csdn.net/dcrmg/article/details/52939318

    张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图) 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下 ...

  5. 雅礼集训 2017 Day1

    T1:loj 6029 市场 题目大意: 维护一个数据结构支持区间加 区间除法 区间求最小值 区间求和 思路: 用线段树维护区间加 区间求最小值 区间和 对于区间除法 注意到除数d很大而加法的w很小 ...

  6. 牛客网【每日一题】 合集

    文章目录 2020年3月25日 NC50439 tokitsukaze and Soldier 牛客练习赛50-C 2020年3月26日 NC13230 合并回文子串 美团2017年CodeM大赛-初 ...

  7. 张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

    from:https://blog.csdn.net/dcrmg/article/details/52939318 使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么 ...

  8. Tensorflow快餐教程(9) - 卷积

    摘要: 卷积的计算方法 卷积 卷积就是滑动中提取特征的过程 在数学中,卷积convolution是一种函数的定义.它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠 ...

  9. 张正友标定Opencv实现、标定流程以及图像坐标转为世界坐标

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiaomifanhxx/article/details/79560693 使用相机以前,首先要进行相 ...

  10. 相机标定(2)opencv2实现

    相机标定步骤 OpenCV使用棋盘格板进行标定,如下图所示.为了标定相机,我们需要输入一系列三维点和它们对应的二维图像点. 1.在黑白相间的棋盘格上,二维图像点很容易通过角点检测找到. 2.而对于真实 ...

最新文章

  1. 实例:使用puppeteer headless方式抓取JS网页
  2. 20170728xlVBA改转置一例
  3. 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
  4. 作业 20180925-1 每周例行报告
  5. DNS的几个基本概念:
  6. java观察者_Java中的观察者模式
  7. idea如何打开pom引用依赖_idea 怎么引入在pom.xml的jar
  8. mysql如何给数据增加tab_怎么往mysql表里添加数据
  9. android 闹钟布局,Android闹钟UI
  10. paip.java 架构师之路以及java高级技术
  11. 申报火热进行中|2021“科创中国”开源创新榜评选
  12. 如何在excel中创建二级菜单,即选择一个类型后,下一单元格可以选择其子类型
  13. java 伊甸园_离伊甸园仅一步之遥
  14. 前端html与css学习笔记总结篇(超详细)
  15. CentOS7上软RAID的实现
  16. 阿里云购买域名到icp备案
  17. 张量学习(1):张量的基本概念
  18. UCK商学院《当区块链遇见UCK》人物专访——张伟杰:区块链给90后带来新的机遇
  19. 自考02324离散数学第一章思维导图
  20. 天气显示服务器不可用,Windows7系统小工具天气不显示提示所在的地区无法使用服务...

热门文章

  1. win10启动修复_高手教你怎样在Win10上修复主引导记录(MBR),轻松解决启动故障...
  2. Android 获取外网IP地址
  3. 微信公众号服务号怎么添加模板消息给所有粉丝群发
  4. linux下安装nginx
  5. 吹塑模具和注塑模具的区别
  6. 程序员如何准备简历以及面试的要求
  7. 字节跳动-大数据研发面试准备
  8. 使用php生成条形码
  9. DHT磁力链数据爬取和资源搜索站的搭建
  10. 中国外显子组测序行业市场供需与战略研究报告