806:Spatial Structures

Spatial Structures

#include<bits/stdc++.h>
using namespace std;
const int maxn = 64 + 5;
int n,len;
int seq[maxn*maxn];
char img[maxn][maxn];
struct node{
    char c = 0;
    int cnt = 4;
    int path[5] = {0};
    node* dad = NULL;
    node* nw = NULL;
    node* ne = NULL;
    node* sw = NULL;
    node* se = NULL;
};
node* nodes[maxn*maxn];
bool judge(int x1,int y1,int x2,int y2)
{
    char c = img[x1][y1];
    for(int i = x1;i <= x2;i++){
        for(int j = y1;j <= y2;j++){
            if(img[i][j] != c) return false;
        }
    }
    return true;
}
void build_tree(node* root,int x1,int y1,int x2,int y2)
{
    if(judge(x1,y1,x2,y2)){
        root->c = img[x1][y1];
        if(root->c == '1') nodes[len++] = root;
        return;
    }
    node* nw = new node;
    node* ne = new node;
    node* sw = new node;
    node* se = new node;
    int* p = root->path;
    for(int i = 4;i > 0;i--){
        if(!p[i]) continue;
        int t = p[i];
        nw->path[nw->cnt--] = t;
        ne->path[ne->cnt--] = t;
        sw->path[sw->cnt--] = t;
        se->path[se->cnt--] = t;
    }
    nw->path[nw->cnt--] = 1;
    ne->path[ne->cnt--] = 2;
    sw->path[sw->cnt--] = 3;
    se->path[se->cnt--] = 4;
    build_tree(nw,x1,y1,(x1+x2)/2,(y1+y2)/2);
    build_tree(ne,x1,(y1+y2)/2+1,(x1+x2)/2,y2);
    build_tree(sw,(x1+x2)/2+1,y1,x2,(y1+y2)/2);
    build_tree(se,(x1+x2)/2+1,(y1+y2)/2+1,x2,y2);
}
int Pow(int a,int b)
{
    int n = 1;
    while(b--) n *= a;
    return n;
}
int fTot(int* p)
{
    int n = 0,i = 4,j = 0;
    while(i >= 0 && p[i]){
        n += p[i]*Pow(5,j);
        i--; j++;
    }
    return n;
}
void tTof(int n,int* p)
{
    int i = 0,j = 4;
    for(;i < 5;i++){
        if(n >= Pow(5,j)){
            p[i] = n/Pow(5,j);
            n -= p[i]*Pow(5,j);
        }
        j--;
    }
}
void encoding()
{
    len = 0;
    node* root = new node;
    build_tree(root,0,0,n-1,n-1);
    for(int i = 0;i < len;i++){
        int *p = nodes[i]->path;
        seq[i] = fTot(p);
    }
    sort(seq,seq + len);
}
void draw(int x1,int y1,int x2,int y2)
{
    for(int i = x1;i <= x2;i++){
        for(int j = y1;j <= y2;j++){
            img[i][j] = '*';
        }
    }
}
void decoding()
{
    memset(img,0,sizeof(img));
    for(int i = 0;i < len;i++){
        int p[5] = {0};
        tTof(seq[i],p);
        int x1 = 0,y1 = 0,x2 = n-1,y2 = n-1;
        for(int j = 4;j >= 0 && p[j];j--){
            if(p[j] == 1){ x2 = (x1+x2)/2; y2 = (y1+y2)/2; }
            else if(p[j] == 2){ y1 = (y1+y2)/2+1; x2 = (x1+x2)/2; }
            else if(p[j] == 3){ x1 = (x1+x2)/2+1; y2 = (y1+y2)/2; }
            else{ x1 = (x1+x2)/2+1; y1 = (y1+y2)/2+1; }
        }
        draw(x1,y1,x2,y2);
    }
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            if(!img[i][j]) img[i][j] = '.';
        }
    }
}
int main()
{
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    int cnt = 0;
    while(scanf("%d",&n) && n){
        if(cnt) putchar('\n');
        printf("Image %d\n",++cnt);
        if(n > 0){
            for(int i = 0;i < n;i++) scanf("%s",img[i]);
            encoding();
            for(int i = 0;i < len;i++){
                printf("%d",seq[i]);
                if((i+1)%12 == 0 || i == len-1) putchar('\n');
                else putchar(' ');
            }
            printf("Total number of black nodes = %d\n",len);
        }
        else{
            n = -n;
            len = 0;
            while(scanf("%d",&seq[len]) && seq[len] != -1) len++;
            decoding();
            for(int i = 0;i < n;i++) puts(img[i]);
        }
    }
    return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 64 + 5;
char g[maxn][maxn];
int n, k[10] = { 1 };
vector<int>a;

int solve_g(int l,int r,int u,int d,int cur,int p){
    int w = 1, b = 1;
    for(int i = u; i <= d; i++){
        if(!w && !b) break;
        for(int j = l; j <= r; j++){
            if(g[i][j] == '1') w = 0;
            else b = 0;
        }
    }
    if(w || b) return b ? cur : -1;
    int x = (l+r)/2, y = (u+d)/2, t;
    if((t = solve_g(l,x,u,y,cur + k[p],p+1)) > -1) a.push_back(t);
    if((t = solve_g(x+1,r,u,y,cur + 2*k[p],p+1)) > -1) a.push_back(t);
    if((t = solve_g(l,x,y+1,d,cur + 3*k[p],p+1)) > -1) a.push_back(t);
    if((t = solve_g(x+1,r,y+1,d,cur + 4*k[p],p+1)) > -1) a.push_back(t);
    return -1;
}

void solve_a(int a){
    int l = 0, r = n-1, u = 0, d = n-1;
    while(a){
        int x = (l + r) / 2, y = (u + d) / 2;
        switch(a % 5){
            case 1: r = x; d = y; break;
            case 2: l = x + 1; d = y; break;
            case 3: r = x; u = y + 1; break;
            case 4: l = x + 1; u = y + 1; break;
        }
        a /= 5;
    }
    for(int i = u; i <= d; i++){
        for(int j = l; j <= r; j++){
            g[i][j] = '*';
        }
    }
}

int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    for(int i = 1; i<10; ++i) k[i] = k[i-1]*5;
    int cnt = 0,t;
    while(scanf("%d",&n),n){
        if(cnt) printf("\n");
        printf("Image %d\n",++cnt);
        a.clear();
        memset(g,0,sizeof(g));
        if(n > 0){
            getchar();
            for(int i = 0; i<n; ++i) fgets(g[i],maxn-1,stdin);
            if((t = solve_g(0,n-1,0,n-1,0,0)) > -1) a.push_back(t);
            sort(a.begin(),a.end());
            int len = a.size();
            for(int i = 0; i < len;){
                printf("%d",a[i++]);
                if(i%12 == 0 || i == len) printf("\n");
                else printf(" ");
            }
            printf("Total number of black nodes = %d\n",len);
        }
        else{
            n = -n;
            while(1){
                scanf("%d",&t);
                if(t < 0) break;
                solve_a(t);
            }
            for(int i = 0; i < n; ++i){
                for(int j = 0; j<n; ++j)
                    if(!g[i][j]) g[i][j] = '.';
                puts(g[i]);
            }
        }
    }
    return 0;
}

 

posted @ 2018-08-11 23:26  ACLJW  阅读(164)  评论(0编辑  收藏  举报