6.3.4 非二叉树

#好吧,笔者错误估计树结构中的内容了,只能再来一篇写一下非二叉树的模型,放心,马上向图前进
借助这篇文章一定要注意,再C++中传递已知长度的数组,如果传递引用的时候(指针也是一样)
格式如此type (&name)[m][n]
这样才会被计算机认可,其实也正常,这与运算符的优先级相关
[]的优先级高于&,因此运算的时候如果不是指针数组,而是数组指针就需要按照上述的方式来描写,否则其代表的是一个数组,数组元素为指针或者引用,所以在传递参数的时候会报错

Quadtrees题解

点击查看笔者代码
#include<iostream>
#include<cstring>
#include<sstream>
using namespace std;

const int maxl = 35;
int met1[maxl][maxl], met2[maxl][maxl];

void build(int (&m)[maxl][maxl], int x, int y, int len) {
  char ch = getchar();
  if(ch == 'p') {
  	build(m, x, y+len/2, len/2);
  	build(m, x, y, len/2);
  	build(m, x+len/2, y, len/2);
  	build(m, x+len/2, y+len/2, len/2);
  }
  else if(ch == 'f') {
  	for(int i = x; i < x+len; i++) 
  	  for(int j = y; j < y+len; j++) 
  	    m[i][j] = 1;
  }
}

int main() {
  int t;
  string line;
  cin >> t;
  while(t--) {
  	int sum = 0;
  	memset(met1, 0 ,sizeof(met1));
  	memset(met2, 0, sizeof(met2));
  	getchar();
    build(met1, 0, 0, 32); 
    getchar();
	build(met2, 0, 0, 32);
    for(int i = 0; i < 32; i++) 
      for(int j = 0; j < 32; j++)
        if(met1[i][j] || met2[i][j]) sum++;
    cout << "There are " << sum << " black pixels.\n";
  }
  return 0;
} 

这道题并没有非常变态,本质上,不过是将二叉树变种成了四叉树罢了,笔者这回终于在递归的同时进行处理了,因为这边的定义仍然采用递归定义,因此很自然的想到递归处理,即边读入边处理,当然笔者的处理方式仍然较为暴力,依然把本题当作模拟题,并没有进行多少优化

在这边作者提出由于四分树比较特殊,只需给出先序遍历就能确定整棵树,笔者在这里不认同该说法,这边的四分树应该只是指如果按照题目中的输入方式,那么确实可以唯一确定一棵四分树,很简单p下面必然有四个分支,其他的都只有一个分支,但是对于一个一般的四叉树,如果输入方式未定,那么先序遍历不会唯一确定一棵四分树,有前面的经验可以猜想,一般来说,单独的一种遍历都难以确定唯一的树型结构,n叉树也是同样符合的

点击查看代码
#include<cstdio>
#include<cstring>

const int len = 32;
const int maxn = 1024 + 10;
char s[maxn];//作者在这边采用字符串的方式来读取,但是因为本题的特殊性可以通过先序遍历确定这棵树,因此直接读取字符也是可以的,不过需要注意\n的影响 
int buf[len][len], cnt;//因为最后是将二者结合在一起,因此只存放在一个地方也是可以的,甚至对于内存的优化更好 

//把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中
//2 1
//3 4
void draw(const char* s, int& p, int r, int c, int w) {
  char ch = s[p++];
  if(ch == 'p') {
  	draw(s, p, r, c+w/2, w/2);//1
	draw(s, p, r, c, w/2);//2
	draw(s, p, r+w/2, c, w/2); //3
	draw(s, p, r+w/2, c+w/2, w/2);//4,就是经典的n叉树递归的写法 
  }else if(ch == 'f') { //画黑像素(白像素不画)
    for(int i = r; i < r+w; i++)
	  for(int j = c; j< c+w; j++)
	    if(buf[i][j] == 0) { buf[i][j] = 1; cnt++; }//这边统计答案的方式非常巧妙,笔者当初并没有想到,过程中的优化同时非常重要,尽量减少冗余部分的出现	
  }
} 

int main() {
  int T;
  scanf("%d", &T);
  while(T--) {
    memset(buf, 0, sizeof(buf));
    cnt = 0;
    for(int i = 0; i < 2; i++) {
      scanf("%s", s);
      int p = 0;
      draw(s, p, 0, 0, len);//对于重复操作的简化以及抽象 
	}
	printf("There are %d black pixels.\n", cnt);
  }
  return 0;
}
posted @   banyanrong  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示