uva297(quadtree)

给我们两棵quadtree的前序遍历,要我吗求原来32*32的矩阵有多少个位置是黑的

quardtree是将区域划分为相等的4个子空间,然后再递归划分这4个子空间,知道满足条件后终止划分

 这题的终止条件是遇到黑色或者白色的结点停止递归

至于为什么一个前序遍历就能建树,是因为结点颜色的缘故,所以能够知道何时递归返回。所以能够建立一课树

都没什么空敲java代码,反正C++语法都很熟悉了,就用java刷题吧,刷题,学java两不误

 1 import java.util.Scanner;
 2 
 3 
 4 public class Main {
 5     static Scanner cin = new Scanner(System.in);
 6     final static int LEN = 32;
 7     static int ans = 0;
 8     static String str;
 9     static int p;
10     static int [][] mat = new int [LEN][LEN];
11     public static void dfs(int r, int c, int w){//(r,c)是左上角
12         
13         char ch = str.charAt(p++);
14         if(ch=='p'){
15             dfs(r,c+w/2,w/2);//对于图中区域1部分的, 
16             dfs(r,c,w/2);//对于图中区域2部分的, 
17             dfs(r+w/2,c,w/2);//对于图中区域3部分的, 
18             dfs(r+w/2,c+w/2,w/2);//对于图中区域4部分的, 
19         }
20         else if(ch=='f'){//如果遇到黑色的结点,就填充矩形
21             for(int i=r; i<r+w; ++i)
22                 for(int j=c; j<c+w; ++j)
23                 if(mat[i][j]==0){//因为是两棵树合并,所以有可能重复填充,所以只有填充0的时候计算ans++
24                     mat[i][j] = 1;
25                     ans++;
26                 }
27         }
28     }
29     public static void init(){
30         ans = 0;
31         for(int i=0; i<LEN; ++i)
32             for(int j=0; j<LEN; ++j)
33                 mat[i][j] = 0;
34     }
35     public static void main(String[] args) {
36         int n;
37         
38         n = cin.nextInt();
39         cin.nextLine();
40         for(int i=0; i<n; ++i){
41             init();
42             p = 0;
43             str = cin.nextLine();
44             dfs(0,0,LEN);
45             p = 0;
46             str = cin.nextLine();
47             dfs(0,0,LEN);
48             System.out.println("There are "+ans+" black pixels.");
49         }
50     }
51 
52 }
View Code
原文地址:https://www.cnblogs.com/justPassBy/p/4457301.html