• UVA-806 Spatial Structures (四分树)


    题目大意:将一块图像上的黑点在两种表示法之间转换。

    题目分析:递归下去。。。

    注意:输出时要注意细节!!!

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<vector>
    # include<string>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    char p[80][80];
    int ans;
    vector<int>v;
    
    int get(int r,int c,int w)
    {
        int cnt=0;
        for(int i=r;i<r+w;++i)
            for(int j=c;j<c+w;++j)
                if(p[i][j]=='1')
                    ++cnt;
        return cnt;
    }
    
    int getVal(string path)
    {
        int l=path.size();
        int res=0;
        for(int i=l-1;i>=0;--i)
            res=res*5+path[i]-'0';
        return res;
    }
    
    ///查看以(r,c)为左上角,边长为w的子正方形。下同。
    void f1(int r,int c,int w,string path)
    {
        int k=get(r,c,w);
        if(k==0)
            return ;
        if(k==w*w){
            ++ans;
            v.push_back(getVal(path));
            return ;
        }
        f1(r,c,w/2,path+'1');
        f1(r,c+w/2,w/2,path+'2');
        f1(r+w/2,c,w/2,path+'3');
        f1(r+w/2,c+w/2,w/2,path+'4');
    }
    
    void f2(int r,int c,int w,int s)
    {
        if(s==0){
            for(int i=r;i<r+w;++i)
                for(int j=c;j<c+w;++j)
                    p[i][j]='*';
            return ;
        }
        int mod=s%5;
        if(mod==1)
            f2(r,c,w/2,s/5);
        else if(mod==2)
            f2(r,c+w/2,w/2,s/5);
        else if(mod==3)
            f2(r+w/2,c,w/2,s/5);
        else if(mod==4)
            f2(r+w/2,c+w/2,w/2,s/5);
    }
    
    int main()
    {
        //freopen("UVA-806 Spatial Structures.txt","r",stdin);
        int n,cas=0,flag=0;
        while(scanf("%d",&n)&&n)
        {
            v.clear();
            if(flag)
                printf("
    ");
            flag=1;
            if(n>0){
                for(int i=0;i<n;++i)
                    scanf("%s",p[i]);
                printf("Image %d
    ",++cas);
                ans=0;
                f1(0,0,n,"");
                sort(v.begin(),v.end());
                int l=v.size();
                for(int i=0;i<l;++i)
                    printf("%d%c",v[i],(i%12==11||i==l-1)?'
    ':' ');
                printf("Total number of black nodes = %d
    ",ans);
            }
            if(n<0){
                n=-n;
                for(int i=0;i<n;++i){
                    for(int j=0;j<n;++j)
                        p[i][j]='.';
                    p[i][n]=0;
                }
                int a;
                while(scanf("%d",&a)&&a!=-1)
                    v.push_back(a);
                printf("Image %d
    ",++cas);
                int l=v.size();
                for(int i=0;i<l;++i)
                    f2(0,0,n,v[i]);
                for(int i=0;i<n;++i)
                    puts(p[i]);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    1、嵌入式Linux开发环境搭建
    JAVA_SE基础——1.JDK&JRE下载及安装
    数组
    Java方法的概述
    Java流程控制
    初识Java
    windows常用的快捷键和dos命令
    window10 Java JDK环境变量配置
    jQuery学习 (实现简单选项卡效果练习test)
    jQuery学习 (实现内联下拉菜单效果(一个小test)
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4858658.html
Copyright © 2020-2023  润新知