0. 这其实是一道很水的题,无非就是dfs罢了。但由于我今天有些急了,还是花了2个点。。
1. 无需建树。
2. 格式控制。
1. 无需建树。
2. 格式控制。
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define LL long long
#define maxn 105
#define maxm 10005
#define mod 1000000007
#define INF 1000000007
#define eps 1e-5
#define PI 3.1415926535898
#define N 26
using namespace std;
//-------------------------CHC------------------------------//
char G[maxn][maxn];
vector<int> v;
int n;
const int dx[] = { 0, 0, 1, 1 };
const int dy[] = { 0, 1, 0, 1 };
bool is_pure(int x, int y, int len) {
int col[2];
col[0] = col[1] = 0;
for (int i = 0; i < len; ++i)
for (int j = 0; j < len; ++j)
col[G[x + i][y + j] - '0'] = 1; //手残打错。。。debug好久。
return (col[1] + col[0]) == 1;
}
void build(int num, int level, int x, int y, int len) {
if (is_pure(x, y, len)) {
if (G[x][y] == '1')
v.push_back(num);
return;
}
len >>= 1;
for (int i = 0; i < 4; ++i) {
int r = x + dx[i] * len, c = y + dy[i] * len;
build(num + (i + 1)*pow(5, level), level + 1, r, c, len);
}
}
void paint(int x, int y, int len) {
for (int i = 0; i < len; ++i)
for (int j = 0; j < len; ++j)
G[x + i][y + j] = 1;
}
void draw(int x, int y, int len, int val) {
if (val) {
int i = val % 5 - 1; //开始想反了。。还不如直接以实例来判断,,9 = 14, 14建树。。。
len >>= 1;
draw(x + dx[i] * len, y + dy[i] * len, len, val/5);
return;
}
paint(x, y, len);
}
int main() {
int kase = 1;
while (scanf("%d", &n) && n) {
if (kase > 1) puts("");
printf("Image %d\n", kase++);
if (n > 0) {
v.clear();
for (int i = 1; i <= n; ++i)
scanf("%s", G[i] + 1);
build(0, 0, 1, 1, n);
sort(v.begin(), v.end());
if (v.size()) {
printf("%d", v[0]);
for (int i = 1; i < v.size(); ++i) {
if (((i + 1) % 12 - 1)) putchar(' '); //坑爹的格式控制。
printf("%d", v[i]);
if ((i + 1) % 12 == 0) puts("");
}
if ((v.size()) % 12) puts(""); //。。。
}
printf("Total number of black nodes = %d\n", v.size());
}
else {
CLEAR(G, 0);
n = -n;
int val;
while (scanf("%d", &val) && val != -1)
v.push_back(val);
for (int i = 0; i < v.size(); ++i)
draw(1, 1, n, v[i]);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (G[i][j]) putchar('*');
else putchar('.');
}
puts("");
}
}
}
return 0;
}