概述
题意:一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个子图表示一个点。 f表示这块子图填满, p表示它还有4个子图, e表示没有子图(当然啦, 它也没有填满)。 给定两个字符串(其实就是两幅图, 两棵树), 求把两图合并后的图的黑点数。
思路:可以根据两字符串建两棵树, 然后合并。 但是直接用字符串合并似乎会更简单。从头到尾逐个字符比较两个字符串, 如果是ff、ee、pp则输出f、e、p到buff,如果是pe则输出p及p后面的4个字母(它的子图), 如果是pf则输出f, p后面4个字母(p当然也要读掉, 有比较的都要在原有字符串里读掉), 如果是pf, 则输出f。 合并好字符串后, 用递归的方式统计黑点数, 遇到p往下递归一层, 每往下递归一层f所代表的黑点数要除以4.
算法复杂度:o(N), N是最长的的那个字符串的长度。
代码:
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX_LEN 3000
#define SUM_BIT 1024
#define PP 224
#define FF 204
#define EE 202
#define PE 213
#define PF 214
#define EF 203
void doSame(char *&, char *&, char *&);
void doPE(char *&, char *&, char *&);
void doPF(char *&, char *&);
void countBit(char *&, int);
int count;
const int bit[6] = {1024, 256, 64, 16, 4, 1};
int main()
{
int cases;
scanf("%d%*c", &cases);
while (cases--) {
// init
char str1[MAX_LEN];
char str2[MAX_LEN];
char rslt[MAX_LEN];
int levelMrak[MAX_LEN];
char *p1 = str1;
char *p2 = str2;
char *p = rslt;
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
memset(rslt, 0, sizeof(rslt));
memset(levelMrak, 0, sizeof(levelMrak));
// enter
gets(str1);
gets(str2);
// star
while (true) {
int sum = (int) (*p1 + *p2);
if (sum == PP || sum == FF || sum == EE) {
doSame(p1, p2, p);
} else if (sum == PE) {
if (*p1 == 'p') {
doPE(p1, p2, p);
} else {
doPE(p2, p1, p);
}
} else if (sum == PF) {
if (*p1 == 'f') {
doPF(p1, p2);
} else {
doPF(p2, p1);
}
*p++ = 'f';
} else if (sum == EF) {
*p++ = 'f';
p1++;
p2++;
}
if (!*p1) {
while (*p2) {
*p++ = *p2++;
}
break;
} else if (!*p2) {
while (*p1) {
*p++ = *p1++;
}
break;
}
}
// count
count = 0;
if (rslt[0] == 'f') {
count = SUM_BIT;
} else if (rslt[0] == 'e') {
count = 0;
} else {
p = rslt;
p++;
countBit(p, 1);
}
// output
printf("There are %d black pixels.n", count);
}
return 0;
}
void doSame(char *&p1, char *&p2, char *&p)
{
*p++ = *p1;
p1++;
p2++;
}
void doPE(char *&P, char *&E, char *&rslt)
{
for (int i = 0; i < 5; i++) {
*rslt++ = *P++;
}
E++;
}
void doPF(char *&F, char *&P)
{
F++;
for (int i = 0; i < 5; i++) {
P++;
}
}
void countBit(char *&p, int level)
{
for (int i = 0; i < 4; i++) {
if (*p == 'p') {
p++;
countBit(p, level + 1);
} else if (*p == 'f') {
count += bit[level];
p++;
} else {
p++;
}
}
}
最后
以上就是专一中心为你收集整理的uva297 Quadtrees (树的重建)的全部内容,希望文章能够帮你解决uva297 Quadtrees (树的重建)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复