这道题由于做了前面的四分树的题,思路不难想,就是需要注意的地方,两组数据之间要输出空行,最后后面不能输出,然后就是图形和序列的对应关系有两个特殊的,如果是一般图形,就按照刘汝佳说的对应,如果是全黑,那么对应于一个0,图形全黑,输出一个0,如果图形全黑,那么输入的也就只有一个0,图形全白,那么输入序列的时候输入是空的,只输入一个-1就结束了,如果需要我们输出序列我们也是输出空,一个换行都不要输出,这个是看题才知道了,刘汝佳就没有写
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
char s[70][70];
vi v;
int dx[4] = {0, 0, 1, 1};
int dy[4] = {0, 1, 0, 1};
void dfs(int r, int c, int len, string ss, int x) {
ss += x + '0';
int ok1 = 0, ok2 = 0;
for (int i = r; i < r + len; i++) {
for (int j = c; j < c + len; j++) {
if (s[i][j] == '0') ok1 = 1;
if (s[i][j] == '1') ok2 = 1;
}
}
if (ok1 && ok2) {
for (int i = 1; i <= 4; i++) {
dfs(r + dx[i - 1] * len / 2, c + dy[i - 1] * len / 2, len / 2, ss, i);
}
} else if (!ok1 && ok2) {
ss.erase(ss.begin());
reverse(all(ss));
int num = 0;
for (int i = 0; i < sz(ss); i++) num = num * 5 + ss[i] - '0';
v.pb(num);
}
}
void solve(int r, int c, int len, vector<char> vec) {
if (sz(vec)) {
if (vec[0] == '0') vec.erase(vec.begin());
char ch = vec[0];
vec.erase(vec.begin());
solve(r + dx[ch - '1'] * len / 2, c + dy[ch - '1'] * len / 2, len / 2, vec);
} else {
for (int i = r; i < r + len; i++) {
for (int j = c; j < c + len; j++) {
s[i][j] = '*';
}
}
}
}
int main() {
int n;
int cnt = 1;
while (cin >> n && n) {
if (cnt != 1) cout << endl;
cout << "Image " << cnt++ << endl;
if (n > 0) {
int ok1 = 0, ok2 = 0;
for (int i = 0; i < n; i++) {
cin >> s[i];
for (int j = 0; j < n; j++) {
if (s[i][j] == '0') ok1 = 1;
if (s[i][j] == '1') ok2 = 1;
}
}
if (ok1 && !ok2) cout << "Total number of black nodes = 0" << endl;
if (!ok1 && ok2) cout << 0 << endl << "Total number of black nodes = 1" << endl;
if (ok1 && ok2) {
dfs(0, 0, n, "", 0);
sort(all(v));
int i = 0;
while (i < sz(v)) {
for (int j = 0; j < 12 && i < sz(v); i++, j++) {
cout << v[i];
if (j == 11 && i < sz(v) - 1 || i == sz(v) - 1) cout << endl;
else cout << " ";
}
}
cout << "Total number of black nodes = " << sz(v) << endl;
}
} else {
int x;
while (cin >> x && x != -1) {
v.pb(x);
}
if (!sz(v)) {
for (int i = 0; i < -n; i++) {
for (int j = 0; j < -n; j++) {
cout << '.' << (j < -n - 1 ? "" : "\n");
}
}
} else if (sz(v) == 1 && v[0] == 0) {
for (int i = 0; i < -n; i++) {
for (int j = 0; j < -n; j++) {
cout << '*' << (j < -n - 1 ? "" : "\n");
}
}
} else {
for (int i = 0; i < -n; i++) {
for (int j = 0; j < -n; j++) {
s[i][j] = '.';
}
}
for (int i = 0; i < sz(v); i++) {
vector<char> vec;
vec.pb('0');
while (v[i]) {
vec.pb(v[i] % 5 + '0');
v[i] /= 5;
}
solve(0, 0, -n, vec);
}
for (int i = 0; i < -n; i++) {
for (int j = 0; j < -n; j++) {
cout << s[i][j] << (j < -n - 1 ? "" : "\n");
}
}
}
}
v.clear();
}
return 0;
}