zoukankan      html  css  js  c++  java
  • UVA 806 Spatial Structures

    题意:

      如果某一大区域所有色块颜色是相同的,那么这一个大区域就算作一块,如果不同,则将其划分成四个小区域,然后重复上述步骤递归进行直到所有区域的颜色相同为止。然后根据上面划分的区域建树,小区域作为大区域的子树:然后对于每一个黑色的区域,也就是上面树上是黑色的结点,将其从叶子结点到根节点的路径表示出来,每一个非叶子结点的四条路权值分别为1、2、3、4.路径表示向黑白图像的转换则是反过来,将数字序列转换为黑白的点阵图。

    分析:

      其实就是四叉树的一个运用。黑白图像转化成路径很简单。在四叉图的时候,找到黑色部分统计他到根节点的路径(5进制)。假如数的第二层的第二个是黑色,他的亲代是第一层的第三个,则它的路径是23.再把路径转化10进制,这样就是最终的路径。

      路径表示向黑白图像的转换的话。就把路径取余,这是本层的第几个节点,之后除以5 ,直到==0.

    代码:

      

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    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;
    }
    void f1(int r,int c,int w,string path)
    {
    //cout<<1<<endl;
    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()
    {
    int n,cas=0,flag=0;
    while(scanf("%d",&n)&&n)
    {
    v.clear();
    if(flag)
    printf(" ");
    flag=1;
    if(n>0)
    {
    //cout<<1<<endl;
    int i,j;
    //cout<<n<<endl;
    for(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(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;
    int i,j;
    for(i=0;i<n;i++)
    {
    for(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(i=0;i<l;++i)
    f2(0,0,n,v[i]);
    for(i=0;i<n;++i)
    printf("%s ",p[i]);
    }
    }
    }

      

  • 相关阅读:
    表表达式,Substring, CharIndex, 多行数据变同一行的用法
    武汉三首,记录备忘,写的不好,以后再改
    竟然又有两年没有码字发帖了,真是快长草了,打磨一下,克服拖延症,重新回归,重新写起!
    屈指一算,竟然有一年半没有发帖了,真是时光荏苒,白云苍狗!
    下雨有感
    (ETW) Event Trace for Windows 提高 (含pdf下载)
    (ETW) Event Tracing for Windows 入门 (含pdf下载)
    Requirejs加载超时问题的一个解决方法:设置waitSeconds=0
    如何通过Socket TCP发送并接收一个文件?
    Microsoft.VisualBasic.DateAndTime.Timer 与 DateTime.Now.TimeOfDay.TotalSeconds 相当
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4890068.html
Copyright © 2011-2022 走看看