【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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章