紫书UVa806

在这里插入图片描述
以下用invstr存储5进制的字符串,image二维数组存储图像。
solvemap和fillmap分别处理两种不同的情况。
注意输出格式:样例之间有空行,但最后不能有空行;每两个数字之间有空格,但最后不能有空格,并且每打印12个数字则应换行。

#include<iostream>
#include<string>
#include<cassert>
#include<algorithm>
#include<map>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
int qsize;
const int maxn = 64 + 5;
int image[maxn][maxn];
set<string>invstr;
string digitToInvStr(int x)
{
	string s;
	while (x > 0)
	{
		s.append(1, x % 5 + '0');
		x /= 5;
	}
	reverse(s.begin(), s.end());
	return s;
}
int invStrTodigit(const string& s)
{
	int sum = 0;
	int factor = 1;
	for (int i = s.size() - 1; i >= 0; --i)
	{
		sum += (s[i] - '0') * factor;
		factor *= 5;
	}
	return sum;
}
int isAllsame(int le, int ri, int up, int d)//-1为白,0为有黑有白,1为黑
{
	int white = 0, black = 0;
	for (int i = le; i < ri; ++i)
	{
		for (int j = up; j < d; ++j)
		{
			if (image[i][j] == 1)
				++black;
			else
				++white;
		}
	}
	if (white == 0)
		return 1;
	if (black == 0)
		return -1;
	return 0;
}
void solvemap(int le, int ri, int up, int d, string s);
void dep(int le, int rl, int up, int d, string s)
{
	if (isAllsame(le, rl, up, d) == 1)
	{
		invstr.insert(s);
	}
	else if (isAllsame(le, rl, up, d) == 0)
	{
		solvemap(le, rl, up, d, s);
	}
}
void solvemap(int le, int ri, int up, int d,string s)
{
	int midc = (ri + le) / 2, midr = (up + d) / 2;
	dep(le, midc, up, midr, "1" + s);
	dep(le, midc, midr, d, "2" + s);
	dep(midc, ri, up, midr, "3" + s);
	dep(midc, ri, midr, d, "4" + s);
}
void fillmap(int le,int ri,int up,int d,string s)
{
	if (s.empty())
	{
		for (int i = le; i < ri; ++i)
		{
			for (int j = up; j < d; ++j)
			{
				image[i][j] = 1;
			}
		}
		return;
	}
	int midc = (ri + le) / 2, midr = (up + d) / 2;
	string sub = s.substr(0, s.size() - 1);
	char c = s[s.size() - 1];
	if (c == '1')
		fillmap(le, midc, up, midr, sub);
	else if (c == '2')
		fillmap(le, midc, midr, d, sub);
	else if (c == '3')
		fillmap(midc, ri, up, midr, sub);
	else if (c == '4')
		fillmap(midc, ri, midr, d, sub);
}
int main()
{
	//freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
	int kase = 1;
	while (cin >> qsize && qsize != 0)
	{
		memset(image, 0, sizeof(maxn));
		invstr.clear();
		string str;
		if (kase != 1)
			cout << endl;
		cout << "Image " << kase++ << endl;
		if (qsize > 0)
		{
			cin.get();
			for (int i = 0; i < qsize; ++i)
			{
				string tmp;
				getline(cin, tmp);
				for (int j = 0; j < qsize; ++j)
					image[i][j] = tmp[j] - '0';
			}
			if (isAllsame(0, qsize, 0, qsize)==1)
			{
				cout << 0 << endl;
				invstr.insert("0");
			}
			else if (isAllsame(0, qsize, 0, qsize) == 0)
			{
				vector<int>out;
				solvemap(0, qsize, 0, qsize, str);
				int i = 0;
				for (auto &elem:invstr)
				{
					out.push_back(invStrTodigit(elem));
				}
				sort(out.begin(), out.end());
				for (auto& elem : out)
				{
					if (i % 12 != 0)
						cout << " ";
					else if(i != 0)
						cout << endl;
					cout << elem;
					++i;
				}
				cout << endl;
			}
			cout << "Total number of black nodes = " << invstr.size() << endl;
		}
		else
		{
			int tmp;
			qsize *= -1;
			while (cin >> tmp && tmp != -1)
			{
				if (tmp == 0)
				{
					invstr.insert("");
				}
				invstr.insert(digitToInvStr(tmp));
			}
			if (tmp == 0 || !invstr.empty())
			{
				for (auto& elem : invstr)
				{
					fillmap(0, qsize, 0, qsize, elem);
				}
			}
			for (int i = 0; i < qsize; ++i)
			{
				for (int j = 0; j < qsize; ++j)
				{
					if (image[i][j] == 1)
						cout << '*';
					else
						cout << '.';
				}
				cout << endl;
			}
				
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值