暑假提高五-- J - Image Compression(递归)
程序员文章站
2024-03-13 15:33:57
...
【分析】
- 题意大概就是给一个n×n的棋盘,有0和1,再给出一个百分数,如果整个棋盘0或1的数目达到这个数就把整个棋盘换成0或1;如果都没达到,就进行分块,均分4份,按照右上、左上、左下、右下来进行计数。
- 用到递归(代码参考:https://blog.csdn.net/waterboy_cj/article/details/81568774)。
#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;
}