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 }
时间: 2024-10-25 04:15:43

UVa 806 四分树的相关文章

Uva 297 四分树

题意: 有一个大小为32*32的图像, 它可以描述为一颗四分树, 如下图 注意描述顺序为 2 1 3 4 给出两棵四分树的先序遍历, 求两者合并后, 黑色像素的个数. 分析: 因为本题给的树是一颗完全的树, 所以只需要给出先序遍历, 就能确定整棵树. 我们可以建一个32*32的数组模拟涂色的过程, 是一个锻炼递归的好题目, 递归的代码通常也可以写的很简便. 每次确定一个左上角坐标(r,c), 和长度len,就可以把一个矩形区域填充. 最后数一下填充多少个即可. #include <bits/st

UVa 297 Quadtrees(四分树)

题意  可以用一个四分图表示一32*32的黑白图像   求两个四分树对应图像相加所得图形黑色部分有多少像素 直接用一个32*32的矩阵表示图  黑色为非0白色为0  递归建图   最后有多少个非零就是答案了 #include<cstdio> #include<cstring> using namespace std; const int L = 32, N = 1050; char s[N]; int ans[L][L], cnt; void draw(char *s, int &

UVA - 297 Quadtrees (四分树)

题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include<sstream> #include<iterator> #include<algorithm> #inclu

UVa 297.Quadtrees【非二叉树之四分树】【7月31】

Quadtrees A quadtree is a representation format used to encode images. The fundamental idea behind the quadtree is that any image can be split into four quadrants. Each quadrant may again be split in four sub quadrants, etc. In the quadtree, the imag

四分树 (Quadtrees UVA - 297)

题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn = 1024 + 5; 6 const int len = 32 ; 7 int tree[len][len],pcount; 8 char

uva 11992 线段树对矩阵进行更新查询

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143 把矩阵变成一行,然后计算位置,lrj给了线段树数组做法 但是我做的线段树空间过大,直接爆掉,所以换方法了 主要还是测试自己的线段树区间更新的模板 各种RE+WA之后AC,,,,, 做的时候出现的几个错误: 1.行和列弄错 2.build初始化的时候,mmin mmax 都初始化为0才对

UVA 11525 Permutation(树状数组)

题目意思是说  给你一个数k  然后有k个si   问你1--k 的第n个全排列是多少   注意是 1 2 3...k的全排列 不是si的 N=   由观察得知(k-i)!就是k-i个数字的全排列种数, 0=<Si<=k-i,所以显然可知假设当i==1时从第(k-1)!*s1到第n个全排列都是由第S1+1个数字开始的数列,因为每(k-1)!次排列过后,下一个排列的第1个数字都要增大1(每隔(k-1)!次,这k-1个数字都排列过一遍了,下一次只能增大更前面一个,也就是第1个了) 比如对于数列{1

uva 12299 线段树 点相关的操作模板

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=502&page=show_problem&problem=3720 唯一值得一说的就是shift,变成更新点就行 这道题主要是测试下我做的算法模板 先贴模板 /**************************************************************** 2014.4 By Pilgr

搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status][Discuss] Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量.所以,整个表格储存的总能量是, 随着时间的推移,格子中的能量会渐渐减少.一个时间