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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)