UVa 806 四分树

Posted Neord

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 806 四分树相关的知识,希望对你有一定的参考价值。

题意:

分析:

类似UVa 297, 模拟四分树四分的过程, 就是记录一个左上角, 记录宽度wideth, 然后每次w/2这样递归下去。 注意全黑是输出0, 不是输出1234。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 // 1 2
  4 // 3 4
  5 const int base5[8] = {1,5,25,125,625,3125,15625,78125};
  6 int n;
  7 string G[70];
  8 vector<int> code;
  9 int dfs(int r, int c, int w,int num,int dep){
 10     int lt[5][2] = {{},{r,c},{r,c+w/2},{r+w/2,c},{r+w/2, c+w/2}};
 11 
 12     for(int i = 1; i <= 4; i++){
 13         int all_black = 1, have_black = 0;
 14 
 15         for(int j = lt[i][0]; j < lt[i][0] + w/2; j++){
 16             for(int k = lt[i][1]; k < lt[i][1] + w/2; k++){
 17                 if(G[j][k] == \'0\'){
 18                     all_black = 0;
 19                 }
 20                 else {
 21                     have_black = 1;
 22                 }
 23             }
 24         }
 25         if(all_black == 0){
 26 
 27             if(w == 2){//宽度为2四分,只有一个格子, 只能为白
 28                 continue;
 29             }
 30             if(have_black)
 31                 dfs(lt[i][0], lt[i][1], w/2, num + base5[dep]*i, dep + 1 );
 32         }
 33         else{
 34             code.push_back(num + base5[dep] * i);
 35         }
 36     }
 37 }
 38 void print(int r, int c, int w, int dep,int decode, int dec){
 39     int lt[5][2] = {{},{r,c},{r,c+w/2},{r+w/2,c},{r+w/2, c+w/2}};
 40     if(decode == 0){
 41         for(int i = r; i < r + w; i++){
 42             for(int j = c; j < c + w; j++ ){
 43                 G[i][j] = \'1\';
 44             }
 45         }
 46         return;
 47     }
 48 
 49     dec = decode % 5;
 50     decode /= 5;
 51 
 52 
 53     for(int i = 1; i <= 4; i++){
 54         if(dec == i){
 55             print(lt[i][0], lt[i][1], w/2 , dep + 1,decode, dec);
 56         }
 57         else continue;
 58     }
 59 }
 60 int main(){
 61     ios::sync_with_stdio(false);
 62     int kase = 1;
 63     while(cin >> n && n){
 64 
 65         if(kase > 1) cout <<\'\\n\';
 66         cout << "Image "<<kase ++ << \'\\n\';
 67 
 68         if(n > 0){
 69             int flag = 0;
 70             for(int i = 0; i < n; i++){
 71                 cin >> G[i];
 72                 for(int j = 0; j < G[i].size(); j++){
 73                     if(G[i][j] == \'0\') flag = 1;
 74                 }
 75             }
 76             if(!flag){//特判全黑
 77                 cout << "0\\n";
 78                 cout << "Total number of black nodes = 1"<< "\\n";
 79                 continue;
 80 
 81             }
 82 
 83             if(n == 1){//特判n = 1 全白。
 84                 cout << "Total number of black nodes = 0" << "\\n";
 85                 continue;
 86            }
 87 
 88 
 89             dfs(0,0,n,0,0);
 90             sort(code.begin(), code.end());
 91             for(int i = 0; i < code.size(); i++){
 92                 cout << code[i];
 93                 if((i + 1) % 12 == 0 || i == code.size() - 1)
 94                     cout <<\'\\n\';
 95                 else cout << \' \';
 96             }
 97 
 98             cout << "Total number of black nodes = "<< code.size() << \'\\n\';
 99             code.clear();
100         }
101 
102         else {
103             n = -n;
104             for(int i = 0; i < n; i++){
105                 G[i] = "";
106                 G[i]. resize(n +7);//string要更改size才能下标访问
107             }
108             int decode;
109             while(cin >> decode && decode != -1){
110                 print(0,0,n,0,decode, 0);
111             }
112             for(int i = 0; i < n; i++){
113                 for(int j = 0; j < n; j++){
114                     if(G[i][j] == \'1\'){
115                         cout << \'*\';
116                     }
117                     else cout << \'.\';
118                 }
119                 cout << \'\\n\';
120             }
121         }
122     }
123 
124 
125     return 0;
126 }

 

以上是关于UVa 806 四分树的主要内容,如果未能解决你的问题,请参考以下文章

UVA806-Spatial Structures(四分树)

Uva 297 四分树

UVA - 297 Quadtrees (四分树)

四分树- UVa 297

四分树 (Quadtrees UVA - 297)

UVA297:Quadtrees(四分树)