欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

uva 806(四叉树dfs 递归 )

程序员文章站 2022-06-03 21:09:57
...

uva 806(四叉树dfs 递归 )uva 806(四叉树dfs 递归 )

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

vector<int>vec;
char l[70][70];

int dfs(int x,int y,int len,int sum,int cnt)
{
    bool flag = true,flag1 = true;
    for(int i = x ; i < x + len ; i++){
        for(int j = y ; j < y + len ; j++){
            if(l[i][j] == '1') flag = false;
            else flag1 = false;
        }
    }

    //如果只有一种颜色
    if(flag || flag1) return flag1 ? sum : 0;
    int t;
    if((t = dfs(x, y, len/2, sum+1*cnt, cnt*5)) && t) vec.push_back(t);
    if((t = dfs(x, y+len/2, len/2, sum+2*cnt, cnt*5)) && t) vec.push_back(t);
    if((t = dfs(x+len/2, y, len/2, sum+3*cnt, cnt*5)) && t) vec.push_back(t);
    if((t = dfs(x+len/2, y+len/2, len/2, sum+4*cnt, cnt*5)) && t) vec.push_back(t);
    return 0;
}

void change(int x,int y,int len)
{
    for(int i = x ; i < x + len ; i++){
        for(int j = y ; j < y + len ; j++){
            l[i][j] = '*';
        }
    }
}

int main()
{
    int n,t = 1;
    while(cin >> n && n){
        if(t > 1) printf("\n");
        vec.clear();
        memset(l,0,sizeof l);
        if(n > 0){
            getchar();
            for(int i = 0 ; i < n ; i++)
                scanf("%s",l[i]);
            bool flag = false;
            for(int i = 0 ; i < n ; i++)
                for(int j = 0 ; j < n ; j++)
                    if(l[i][j] == '0'){
                        flag = true;
                        break;
                    }
            if(flag) dfs(0,0,n,0,1);
            else vec.push_back(0);
            sort(vec.begin(),vec.end());
            int k = vec.size();
            printf("Image %d\n",t++);
            for(int i=0;i<vec.size();){
                printf("%d",vec[i++]);
                if(i%12==0||i==(int)vec.size()) printf("\n");
                else printf(" ");
            }
            printf("Total number of black nodes = %d\n",k);
        }
        else{
            n = -n;
            for(int i = 0 ; i < n ; i++)
                for(int j = 0 ; j < n ; j++)
                    l[i][j] = '.';
            int k;
            while(cin >> k && k != -1){
                int x = 0,y = 0,len = n;
                while(k){
                    int a = k % 5;
                    switch(a){
                        case 1:len /= 2;break;
                        case 2:y += len/2;len /= 2;break;
                        case 3:x += len/2;len /= 2;break;
                        case 4:x += len/2;y += len/2; len /= 2;
                    }
                    k /= 5;
                }
                change(x,y,len);
            }
            printf("Image %d\n",t++);
            for(int i = 0 ; i <n ; i++)
                printf("%s\n",l[i]);
        }
    }

    return 0;
}

相关标签: 紫书