黑白矩阵(美团)
输入一个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;
}