程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 297 Quadtrees

uva 297 Quadtrees

編輯:C++入門知識

題目意思:給定兩個字符串,字符p對應建立子樹,字符e為白色,f為黑色對於不同層黑點f對應不同的值,最上面為1024下來為每個子樹256.....,這樣建立兩顆四叉樹,計算兩顆樹相加後的黑點f對應的值,注意在兩顆樹上同一點處,只要有一個為黑點,那麼相加後就為黑點

解題思路:1首先建立兩顆樹,采用遞歸建樹的方法  2建完樹後利用前序遍歷的方法進行遞歸求解和

代碼:

[cpp]
<span style="font-size:18px;">#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <string> 
#include <cstdlib> 
#include <deque> 
#include <algorithm> 
using namespace std; 
 
const int MAXN = 1000010;//定義一個常量 
 
//4叉樹的結構體 
struct Btree{ 
    char c; 
    struct Btree *child[4];//四叉我們開個數組存儲四個子樹 
}; 
Btree *root1 , *root2;//兩顆樹的根節點 
char  str1[MAXN] , str2[MAXN];//存儲讀入的兩串字符串 
int l1 , l2 , sum , pos; 
 
//4叉樹的初始華 
void newnode(Btree *u){ 
    u -> c = 0; 
    for(int i = 0 ; i < 4 ; i++) 
        u -> child[i] = NULL; 

 
//樹的遞歸建立 
Btree* BuildTree(Btree *root , char *str){//返回Btree* 
    ++pos;//pos要為全局,注意遞歸的全局和局部變量區別 
    if(pos == strlen(str))//如果達到字符串末尾則返回NULL 
        return NULL; 
    root = new Btree;//每一New一個 
    newnode(root);//new出來要習慣初始化 
    root -> c = str[pos];//根節點的值為str[pos] 
    if(str[pos] == 'p'){//如果為p則建立子樹,否則直接返回根節點就好 
        for(int i = 0 ; i < 4 ; ++i){ 
            if(root->child[i] == NULL){//如果哪個子樹為空則遞歸產生子樹 
                root->child[i] = BuildTree(root->child[i] , str);  
            } 
        } 
    } 
    return root; 

 
//前序求和(同時遍歷兩顆樹) 
void preorder(Btree *root1 , Btree *root2 , int level){ 
    if(root1 == NULL && root2 == NULL)//如果兩顆樹此時都為空則直接返回 
        return; 
    if(root1 == NULL){//樹1為空時候 
        if(root2->c == 'f'){//如果當前樹2的值為f要加上值1024>>(level*2) 
            sum += 1024>>(level*2);//位運算的使用 
            return;//為f   說明子樹為空直接返回即可 
        } 
        for(int i = 0 ; i < 4 ; i++)//否則遍歷子樹2的四個方向 
            preorder(root1 , root2->child[i] , level+1); 
        return;//記得每一次都要返回 
    } 
    if(root2 == NULL){//同上 
        if(root1->c == 'f'){ 
            sum += 1024>>(level*2); 
            return; 
        } 
        for(int i = 0 ; i < 4 ; i++) 
            preorder(root1->child[i] , root2 , level+1); 
        return; 
    } 
    //如果此時要個都不為空只要有一個是f就要加上對應值 
    if(root1->c == 'f' || root2->c == 'f'){ 
        sum += 1024>>(level*2); 
        return;//返回上一層 
    } 
    for(int i = 0 ; i < 4 ; i++)//四個方向的遍歷 
        preorder(root1->child[i] , root2->child[i] , level+1); 
}   www.2cto.com
 
//輸入函數 
void solve(){ 
    pos = -1; 
    root1 = new Btree; 
    root2 = new Btree; 
    newnode(root1);//初始化 
    newnode(root2); 
    root1 = BuildTree(root1 , str1);//建樹 
    root2 = BuildTree(root2 , str2);//建樹 
    sum = 0; 
    preorder(root1 , root2 , 0); 
    printf("There are %d black pixels.\n" , sum); 

//主函數 
int main(){ 
    int t; 
    scanf("%d" , &t); 
    while(t--){ 
        scanf("%s%s" , str1 , str2);//輸入兩串字符串 
        solve(); 
    } 
    return  0; 

 
 
 
</span> 

作者:cgl1079743846

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved