例题6-11 四分树(Quadtrees, UVa 297)

来源:互联网 发布:美国知乎 编辑:程序博客网 时间:2024/04/28 21:46
因为是完全树所以可以直接由先序遍历确定整棵树。
#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define LL long long#define maxn 10005#define maxm 50#define mod  10007#define INF 100000007#define EPS 1e-7#define PI 3.1415926535898#define N 32using namespace std;//-------------------------CHC------------------------------//char s[maxn];int a[maxm][maxm], idx = 1, ans;const int dirx[] = { 0, 0, 1, 1 }, diry[] = { 0, -1, -1, 0 };void draw(int x, int y, int l) {for (int i = 0; i < l; ++i)for (int j = 0; j < l; ++j)if (a[x + i][y - j] == 0) a[x + i][y - j] = 1, ans++;}void build(int x, int y, int l, char *s) {l >>= 1;for (int i = 0; i < 4; ++i) {if (s[idx] == 'p') {idx++;int a = x + dirx[i] * l, b = y + diry[i] * l;build(a, b, l, s);}else if (s[idx++] == 'f') {int a = x + dirx[i] * l, b = y + diry[i] * l;draw(a, b, l);}}}int main() {IN(); OUT();int T;scanf("%d", &T);while (T--) {CLEAR(a, 0);ans = 0;for (int i = 0; i < 2; ++i) {scanf("%s", s);if (s[0] == 'f') { draw(1, N, N); continue; }if (s[0] == 'e') continue;idx = 1;build(1, N, N, s);}printf("There are %d black pixels.\n", ans);}return 0;}

第一个节点不用特判。代码简洁好多。。
#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <deque>#include <set>#include <map>#include <algorithm>#include <functional>#include <sstream>#include <utility>#include <cstring>#include <cstdio>#include <cstdlib>#include <ctime>#include <cmath>#include <cctype>#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define LL long long#define maxn 10005#define maxm 50#define mod  10007#define INF 100000007#define EPS 1e-7#define PI 3.1415926535898#define N 32using namespace std;//-------------------------CHC------------------------------//char s[maxn];int a[maxm][maxm], idx = 1, ans;void draw(int x, int y, int l) {if (s[idx] == 'p') {l >> 1, idx++;draw(x, y, l);draw(x, y >> 1, l);draw(x << 1, y >> 1, l);draw(x << 1, y, l);}if (s[idx++] == 'f') {for (int i = 0; i < l; ++i)for (int j = 0; j < l; ++j)if (a[x + i][y - j] == 0) a[x + i][y - j] = 1, ans++;}}int main() {IN(); OUT();int T;scanf("%d", &T);while (T--) {CLEAR(a, 0);ans = 0;for (int i = 0; i < 2; ++i) {scanf("%s", s);idx = 0;draw(1, N, N);}printf("There are %d black pixels.\n", ans);}return 0;}

原创粉丝点击