UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)


每天坚持做算法题,熟悉基本的套路,巩固语言基础,总结经验记下所学所想。

题目

黑白图像有两种表示法:点阵表示和路径表示。路径表示法首先需要把图像转化为四分 树,然后记录所有黑结点到根的路径。例如,对于如图6-25所示的图像。

四分树如图6-26所示。

NW、NE、SW、SE分别用1、2、3、4表示。最后把得到的数字串看成是五进制的,转 化为十进制后排序。例如上面的树在转化、排序后的结果是:9 14 17 22 23 44 63 69 88 94 113。
你的任务是在这两种表示法之间进行转换。在点阵表示法中,1表示黑色,0表示白色。
图像总是正方形的,且长度n为2的整数幂,并满足n≤64。输入输出细节请参见原题。

HINT

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <queue>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>

using namespace std;
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define _rep(i, a, b) for (int i = (a); i <= (b); ++i)
typedef long long LL;
/* NW = 1, NE = 2, SW = 3, SE = 4 */
const int MAXN = 64 + 4, DX[] = {0, 0, 1, 1}, DY[] = {0, 1, 0, 1};
int N;
char IMG[MAXN][MAXN];

void countBlack(int x, int y, int len, vector<int>& ans, int path = 0, int p5 = 1) {
int f = 0, len2 = len / 2;
_for(i, x, x + len) _for(j, y, y + len) f += IMG[i][j] - '0';
if (f == 0) return;
if (f == len * len) {
ans.push_back(path);
return;
}
_for(di, 0, 4) countBlack(x+DX[di]*len2, y+DY[di]*len2, len2, ans, path+p5*(di+1), p5*5);
}

void draw(int path, int x, int y, int len) {
if (path == 0) {
assert(len);
_for(i, x, x + len) _for(j, y, y + len) IMG[i][j] = '*';
return;
}
int di = path % 5 - 1, len2 = len / 2;
draw(path / 5, x + DX[di] * len2, y + DY[di] * len2, len2);
}

int main() {
for (int kase = 1; scanf("%d", &N) == 1 && N; kase++) {
if (kase > 1) puts("");
printf("Image %d\n", kase);
if (N > 0) {
_for(i, 0, N) scanf("%s", IMG[i]);
vector<int> blacks;
countBlack(0, 0, N, blacks);
sort(begin(blacks), end(blacks));
int sz = blacks.size();
_for(i, 0, sz) printf("%d%s", blacks[i], (i % 12 == 11 || i == sz - 1) ? "\n" : " ");
printf("Total number of black nodes = %d\n", sz);
} else {
int p;
memset(IMG, 0, sizeof(IMG));
N = -N;
_for(i, 0, N) _for(j, 0, N) IMG[i][j] = '.';
while (scanf("%d", &p) == 1 && p >= 0) draw(p, 0, 0, N);
_for(i, 0, N) puts(IMG[i]);
}
}
return 0;
}

总结

-------------本文结束感谢您的阅读-------------

本文标题:UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)

文章作者:ChengXiao

发布时间:2018年04月10日 - 16:04

最后更新:2018年04月10日 - 19:04

原始链接:http://chengxiao19961022.github.io/2018/04/10/UVa806-习题6-8-空间结构(Spatial-Structures-ACM-ICPC-World-Finals-1998)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

你的鼓励是我前进的动力~