0
点赞
收藏
分享

微信扫一扫

UVA806 空间结构 Spatial Structures

624c95384278 2022-01-22 阅读 13

这道题由于做了前面的四分树的题,思路不难想,就是需要注意的地方,两组数据之间要输出空行,最后后面不能输出,然后就是图形和序列的对应关系有两个特殊的,如果是一般图形,就按照刘汝佳说的对应,如果是全黑,那么对应于一个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;
}
举报

相关推荐

0 条评论