Untitled

 avatar
unknown
plain_text
a year ago
2.9 kB
5
Indexable
#include<iostream>
#include<vector>
#include<stack>

using namespace std;

int n;
int map[100][100];

vector<char> result;
struct toado {
	int x, y;
};
struct block
{
	toado top, bot;
};
stack<block> s;

bool check(int r1, int c1, int r2, int c2)
{
	int ori = map[r1][c1];
	bool flag = true;
	for (int i = r1; i <= r2 && flag; i++)
		for (int j = c1; j <= c2; j++)
		{
			if (map[i][j] != ori)
			{
				flag = false;
				break;
			}
		}
	return flag;
}

int encode()
{
	result.clear();
	s = stack<block>();//contain block
	int r1 = 0, r2 = n - 1;
	int c1 = 0, c2 = n - 1;
	toado top = { r1,c1 };
	toado bot = { r2,c2 };
	block bigest = { top,bot };
	s.push(bigest);
	result.push_back('(');
	//
	while (!s.empty())
	{
		block currentBlock = s.top();
		s.pop();
		r1 = currentBlock.top.x;
		c1 = currentBlock.top.y;
		r2 = currentBlock.bot.x;
		c2 = currentBlock.bot.y;
		//
		bool nigga = check(r1, c1, r2, c2);
		//
		if (nigga)
		{
			result.push_back(map[r1][c1]);
			//kiem tra so luong
			int size = result.size();
			int start = size - 1;
			bool flagClose = false;
			int dem = 0;
			while (1)
			{
				if (result[start] == ')') flagClose = true;
				else if (result[start] == '(' && flagClose) 
				{
					dem++;
					flagClose = false;
				}
				else if (result[start] == '(' && !flagClose) break;
				else if ((result[start + 1] == '(' || result[start + 1] == ')') && (result[start - 1] == '(' || result[start - 1] == ')')) dem++;
				start--;
			}
			if (dem == 4) result.push_back(')');
		}
		else
		{
			//xet 2x2
			if (r2 == r1 + 1 && c2 == c1 + 1)
			{
				result.push_back('(');
				result.push_back(map[r1][c1] + '0');
				result.push_back(map[r1][c2] + '0');
				result.push_back(map[r2][c1] + '0');
				result.push_back(map[r2][c2] + '0');
				result.push_back(')');
				//kiem tra so luong
				int size = result.size();
				int start = size - 1;
				bool flagClose = false;
				int dem = 0;
				while (1)
				{
					if (result[start] == ')') flagClose = true;
					else if (result[start] == '(' && flagClose)
					{
						dem++;
						flagClose = false;
					}
					else if (result[start] == '(' && !flagClose) break;
					else if ((result[start + 1] == '(' || result[start + 1] == ')') && (result[start - 1] == '(' || result[start - 1] == ')')) dem++;
					start--;
				}
				if (dem == 4) result.push_back(')');
			}
			else
			{
				//chia binh thuong
				result.push_back('(');
			}
		}
	}
	//
	result.push_back(')');
	return result.size() + pow(n, 2) / 16 + 2;
}

int main()
{
	FILE* input;
	freopen_s(&input, "input.txt", "r", stdin);
	//
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) cin >> map[i][j];
	//
	int lenght = encode();
	cout << endl;
	for (int i = 0; i < result.size(); i++) cout << result[i];
	//
	return 0;
}
Editor is loading...
Leave a Comment