UVA297四分树(题目链接)
以前看过刘汝佳老师的紫书,过了比较长的时间自己再次重新做了一遍,却一直WA。再次参照刘汝佳老师的书,觉得解题思路基本和他相同,然而结果却。。。。(现在暂时只能先保留着,之后再继续解决)
下面是我自己的答案
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn = 1024;
const int len = 32;
int buf[len][len];
char s[maxn];
void solve(int& p,int x, int y,int size) {
char ch = s[p++];
if (ch == 'p') {
solve(p, x, y, size / 2);
solve(p, x, y - size / 2, size / 2);
solve(p, x + size / 2, y - size / 2, size / 2);
solve(p, x + size / 2, y, size / 2);
}
else if(ch == 'f') {
for (int i = x; i < x + size; i++)
for (int j = y; j > y - size; j--)
buf[i][j] = 1;
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
memset(buf, 0, sizeof(buf));
for (int i = 0; i < 2; i++) {
scanf("%s", s);
int size = len;
int x = 0, y = 31;
int p = 0;
solve(p, x, y, size);
}
int sum = 0;
for (int i = 0; i < len; i++)
for (int j = 0; j < len; j++)
sum += buf[i][j];
printf("There are %d black pixels.\n", sum);
}
return 0;
}
之后是刘汝佳老师紫书给出的参考答案
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int len = 32;
const int maxn = 1024 + 10;
char s[maxn];
int buf[len][len], cnt;
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);
draw(s, p, r, c, w / 2);
draw(s, p, r + w / 2, c, w / 2);
draw(s, p, r + w / 2, c + w / 2, w / 2);
}
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;
}
如果你知道我错在那里,真诚地希望能够不吝赐教,谢谢你!
祝你安好!