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