习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
Posted As_zyh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)相关的知识,希望对你有一定的参考价值。
输出格式上需要注意细节
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n;
char buf[100][100];
int s[100];
int v[10000];
vector<int> ans;
//十进制数转成翻转的五进制
void ten_to_five(int x) {
int cnt = 0;
memset(s, 0, sizeof(s));
while(x > 0) {
int b = x % 5;
s[cnt++] = b;
x = x / 5;
}
s[cnt] = -1;
}
//将五进制数翻转后,转成十进制
int five_to_ten(int x) {
int y = 0;
while(x > 0) {
y = y*10 + x%10;
x = x/10;
}
int cnt = 0, res = 0;
while(y > 0) {
int b = y%10;
for(int i = 0; i < cnt; i++) b *= 5;
res += b;
y = y/10;
cnt++;
}
return res;
}
//把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中
//1 2
//3 4
void draw(const int* s, int& p, int r, int c, int w) {
int num = s[p++];
switch(num) {
case -1:
for(int i = r; i < r + w; i++) {
for(int j = c; j < c + w; j++) {
buf[i][j] = '1';
}
}
break;
case 1:
draw(s, p, r, c, w/2);
break;
case 2:
draw(s, p, r, c + w/2, w/2);
break;
case 3:
draw(s, p, r + w/2, c, w/2);
break;
case 4:
draw(s, p, r + w/2, c + w/2, w/2);
break;
}
}
int check(int r, int c, int w) {
for(int i = r; i < r + w; i++) {
for(int j = c; j < c + w; j++) {
if(buf[i][j] != '1') return 0;
}
}
return 1;
}
void solve(int r, int c, int w, int num) {
if(check(r, c, w)) {
ans.push_back(0);return;
}
if(w == 1) return;
if(check(r, c, w/2)) {
ans.push_back(five_to_ten(num * 10 + 1));
} else {
solve(r, c, w/2, num*10 + 1);
}
if(check(r, c + w/2, w/2)) {
ans.push_back(five_to_ten(num * 10 + 2));
} else {
solve(r, c + w/2, w/2, num*10 + 2);
}
if(check(r + w/2, c, w/2)) {
ans.push_back(five_to_ten(num * 10 + 3));
} else {
solve(r + w/2, c, w/2, num*10 + 3);
}
if(check(r + w/2, c + w/2, w/2)) {
ans.push_back(five_to_ten(num * 10 + 4));
} else {
solve(r + w/2, c + w/2, w/2, num*10 + 4);
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int q = 0;
while(scanf("%d", &n) == 1 && n) {
if(q > 0) printf("\\n");
memset(buf, '0', sizeof(buf));
memset(v, 0, sizeof(v));
printf("Image %d\\n", ++q);
if(n > 0) {
for(int i = 0; i < n; i++) {
scanf("%s", buf[i]);
}
ans.clear();
solve(0, 0, n, 0);
sort(ans.begin(), ans.end());
int cnt = 0, len = ans.size();
for(int i = 0; i < len; i++) {
if(cnt > 0) printf(" ");
printf("%d", ans[i]);
if(++cnt == 12) {
printf("\\n");
cnt = 0;
}
}
if(cnt != 0 && len > 0) printf("\\n");
printf("Total number of black nodes = %d\\n", ans.size());
} else {
n = -1 * n;
int cnt = 0, x;
while(scanf("%d", &x) == 1 && x != -1) {
v[cnt++] = x;
}
for(int i = 0; i < cnt; i++) {
ten_to_five(v[i]);
int p = 0;
draw(s, p, 0, 0, n);
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(buf[i][j] == '1') printf("*");
else printf(".");
}
printf("\\n");
}
}
}
return 0;
}
以上是关于习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)的主要内容,如果未能解决你的问题,请参考以下文章
习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)
习题6-8 空间结构(Spatial Structures, ACM/ICPC World Finals 1998, UVa806)