黑白矩陣(美團)
輸入一個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;
}