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 }