uva297(quadtree)

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

uva297(quadtree)

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

 

你可能感兴趣的:(dtree)