uva 297

原创 2015年11月20日 17:44:22

题目大意:两个图(四叉树)相加,算出最后的黑色像素有几个。
P表示的是他们还可以分成四个小格子(节点下有四个子女),e表示为空,f表示满,就是被涂黑了。。。

思路:用一个结构体,里面包含着某个节点的四个孩子,和它所在的哪一层(目的是观察到它的黑像素的大小为pow(4, 6 - level);)和标记它们是p还是f还是e,主要是为了当其为f的时候,可以累计黑格子的多少。dfs,分三种情况,分别是两个f,两个P,一个P一个e 分别再进行递归。。

#include <iostream> 
#include <string>
#include <cmath>
using namespace std;
//最多有六层  共有1365个
struct Node
{
    int level;
    int flag;
    Node * son[4];
    Node()
    {
        flag = -1;
        level = 1;
    }
};
int sum=0;
char s1[10005], s2[10005];
char *p;
Node * build(int level)
{
    Node* t = (Node*)malloc(sizeof(Node)); 
    if (*p == 'p')
    {
        t->flag = 0;
        t->level=++level;
//      for (int i = 0; i < 4; i++)
//      {           
            ++p;t->son[0] = build(t->level);
            ++p;t->son[1] = build(t->level);
            ++p; t->son[2] = build(t->level);
            ++p; t->son[3] = build(t->level);
//      }       
            t->level--;
    }
    else if (*p == 'e')
    {
        t->flag = 1;
        t->level = level;
        for (int i = 0; i < 4; i++)
        {
            t->son[i] = NULL;
        }
    }
    else if (*p == 'f')
    {
        t->flag = 2;
        t->level = level;
        for (int i = 0; i < 4; i++)
        {
            t->son[i] = NULL;
        }
    }
    return t;
}
int  DFS(Node *t1, int sum)
{

    if (!t1) return sum;
    if (t1->flag == 2)
    {
        sum = sum + pow(4, 6 - t1->level);
        return sum;
    }
    return sum;
}
void dfs(Node *t1,Node *t2)
{
    if (t1 == NULL && t2 == NULL)
        return;
    if (t1->flag == 1 && t2->flag == 1)
        return;
    if (t1->flag == 2 || t2->flag == 2) // 两个都是f
    {
        sum = sum + pow(4, 6 - t1->level);
        return;
    }
    if (t1->flag == 0  && t2->flag ==0) //两个都是P
    {
        dfs(t1->son[0], t2->son[0]);
        dfs(t1->son[1], t2->son[1]);
        dfs(t1->son[2], t2->son[2]);
        dfs(t1->son[3], t2->son[3]);
    }
    if (t1->flag == 0 && t2->flag == 1) //一个e一个P
    {
        sum=DFS(t1->son[0], sum);
        sum = DFS(t1->son[1], sum);
        sum = DFS(t1->son[2], sum);
        sum = DFS(t1->son[3], sum);
    }
    else if (t2->flag == 0 && t1->flag == 1)
    {
        sum = DFS(t2->son[0], sum); 
        sum = DFS(t2->son[1], sum); 
        sum = DFS(t2->son[2], sum); 
        sum = DFS(t2->son[3], sum);
    }

}
int main()
{
    int n;
    cin >> n;
    getchar();
    while (n--)
    {
        Node * root1 =new Node();
        Node *root2 = new Node();
        cin >> s1;
        p = s1;
        root1=build(root1->level);
        cin >> s2;
        p = s2;
        root2=build(root2->level);
        sum = 0;
        dfs(root1,root2);
        printf("There are %d black pixels.\n",sum);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【UVA297】四象树(BZOJ2664)

2664: 【UVA297】四象树 时间限制: 1 Sec  内存限制: 128 MB 提交: 43  解决: 22 [提交][状态][我的提交] 题目描述 四象树是每个内结点均...

Uva297 Quadtrees【递归建四分树】【例题6-11】

白书 例题6-11 用四分树来表示一个黑白图像:最大的图为根,然后按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的区域全黑或者全白,则直接用一个黑结点或者白结点表示;如果既有黑...
  • kxp9545
  • kxp9545
  • 2017年06月15日 13:24
  • 157

例题 6-11 四分树 UVa 297

Quadtrees  A quadtree is a representation format used to encode images. The fundamental...

uva 297 Quadtrees

点击打开链接 题目意思:给定两个字符串,字符p对应建立子树,字符e为白色,f为黑色对于不同层黑点f对应不同的值,最上面为1024下来为每个子树256.....,这样建立两颗四叉树,计算两颗树相加后的黑...

UVa 297 Quadtrees 递归

#include #include #include using namespace std; const int maxn = 1024; const int len = 32; char...

uva 297 四分树

uva 297 Quadtrees

UVa 297.Quadtrees【非二叉树之四分树】【7月31】

Quadtrees A quadtree is a representation format used to encode images. The fundamental idea behin...

例题:四分树(UVa 297)

【题目】可以用一个四分图表示一32*32的黑白图像 ,法是用根节点来表示整个图像,然后再进行等分,按照从右上角的图像开始逆时针的顺序编号,依次有四个节点,如果某子节点对应的区域是全黑或者全白,则直接用...

uva 297 - Quadtrees

// uva 297 - Quadtrees // 题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8...

uva 297

//这题用的是最笨的方法,建树然后合并,然后计算 //最开始建树都有点问题,最开始用的是指针指向字符串,通过指针一个一个建树,可是怎么都过不了,于是就参考网上直接传数组,求大神解释一下啊 //还有一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva 297
举报原因:
原因补充:

(最多只允许输入30个字)