zoukankan      html  css  js  c++  java
  • UVA 297 Quadtrees

    UVA_297

        由于这个题目可以看成是完全四叉树,所以借用了一下线段树的思想,把题目转化成了对区间进行两次染色,然后求最后色块的个数。

        当然我的程序写得复杂了,lazy可以不用的,在统计的时候遇到黑色节点就返回即可,只不过这样计数的方式就要稍加变化了。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 4000
    int tree[MAXD], lazy[MAXD], cur, M, res;
    char b[1500];
    void down(int t)
    {
    if(lazy[t] == 1)
    {
    tree[t] = 1, lazy[t] = 0;
    if(t < M)
    lazy[4 * t - 2] = lazy[4 * t - 1] = lazy[4 * t] = lazy[4 * t + 1] = 1;
    }
    }
    void build(int t)
    {
    int i;
    down(t);
    if(b[cur] == 'f')
    {
    lazy[t] = 1;
    cur ++;
    }
    else if(b[cur] == 'e')
    cur ++;
    else
    {
    cur ++;
    for(i = -2 ; i <= 1; i ++)
    build(4 * t + i);
    }
    }
    void dfs(int t)
    {
    int i;
    down(t);
    if(t >= M)
    {
    if(tree[t])
    res ++;
    }
    else
    {
    for(i = -2; i <= 1; i ++)
    dfs(4 * t + i);
    }
    }
    void solve()
    {
    int i, j;
    for(i = 1, M = 1; i <= 5; i ++, M = (M << 2) - 2);
    memset(tree, 0, sizeof(tree));
    memset(lazy, 0, sizeof(lazy));
    gets(b);
    cur = 0;
    build(1);
    gets(b);
    cur = 0;
    build(1);
    res = 0;
    dfs(1);
    printf("There are %d black pixels.\n", res);
    }
    int main()
    {
    int t;
    gets(b);
    sscanf(b, "%d", &t);
    while(t --)
    {
    solve();
    }
    return 0;
    }


  • 相关阅读:
    抓老鼠啊~亏了还是赚了?
    币值转换
    打印沙漏
    秋季学期学习总结
    PTA币值转化
    PTA作业
    秋季学习总结
    人生最重要的3个老师
    自我介绍
    vue入门(二) 让axios发送表单形式数据
  • 原文地址:https://www.cnblogs.com/staginner/p/2303990.html
Copyright © 2011-2022 走看看