【解析】
题意:给你介绍了一下压缩技术的原理,先说了无损压缩的原理,然后又说可以用于有损压缩,即对相似度高于T%的部分都可以用同一个值表示,
如:对压缩率为70的一块区域
11
01
那么我们可以全部变为1(1的占有率为75%>70% ,0的占有率为25%<70%)
然后不断的细分整张图每次均分为4块,再执行上述操作。
很明显是递归了。题目看起来比较难懂,但其实懂了就知道跟树完全没关系。
#include <bits/stdc++.h>
using namespace std;
char gra[110][110];
int m;
void f(int x1, int x2, int y1, int y2)
{
int cnt_0 = 0, cnt_1 = 0;
for (int i = x1; i <= x2; i++)
for (int j = y1; j <= y2; j++)
{
if (gra[i][j] == '0')
cnt_0++;
else
cnt_1++;
}
double temp = cnt_0 * 1.0 / double(cnt_0 + cnt_1) * 100.0 - m * 1.0;
if (temp > 0 || fabs(temp) <= 0)
{
for (int i = x1; i <= x2; i++)
for (int j = y1; j <= y2; j++)
gra[i][j] = '0';
return;
}
temp = cnt_1 * 1.0 / double(cnt_0 + cnt_1) * 100.0 - m * 1.0;
if (temp > 0 || fabs(temp) <= 0)
{
for (int i = x1; i <= x2; i++)
for (int j = y1; j <= y2; j++)
gra[i][j] = '1';
return;
}
f(x1, (x1 + x2) / 2, (y1 + y2) / 2 + 1, y2);//右上
f(x1, (x1 + x2) / 2, y1, (y1 + y2) / 2);//左上
f((x1 + x2) / 2 + 1, x2, y1, (y1 + y2) / 2);//左下
f((x1 + x2) / 2 + 1, x2, (y1 + y2) / 2 + 1, y2);//右下
}
int main()
{
int n, ca = 0;
while (~scanf("%d", &n) && n)
{
scanf("%d", &m);
for (int i = 0; i <= n - 1; i++)
scanf("%s", gra[i]);
f(0, n - 1, 0, n - 1);//第一次当然是对整张图啦
printf("Image %d:\n", ++ca);
for (int i = 0; i <= n - 1; i++)
puts(gra[i]);
}
return 0;
}