您的位置:首页 > 其它

[HihoCoder]#1342 : Full Binary Tree Picture

2016-07-18 22:07 387 查看
华电北风吹

天津大学认知计算与应用重点实验室

2016-07-17

题目链接:

http://hihocoder.com/problemset/problem/1342

题目分析:

从树的根节点开始递归即可。关键在于计算好左右子孩子坐标。

参考代码:

#include <iostream>
#include <math.h>
using namespace std;

int CountWidth(int n)
{
return pow(2, n + 1) - pow(2, n - 1) - 1;
}

void CountLeftChild(int N, int x, int y, int &x_leftChild, int &y_leftChild)
{
int N_width = CountWidth(N);
int N_x2, N_y1;
N_y1 = y - N_width / 2;
N_x2 = x + N_width / 2;
if (N > 2)
{
int ChildWidth = CountWidth(N - 1);
x_leftChild = N_x2 - ChildWidth / 2;
y_leftChild = N_y1 + ChildWidth / 2;
}
else
{
x_leftChild = N_x2;
y_leftChild = N_y1;
}
}

void CountRightChild(int N, int x, int y, int &x_rightChild, int &y_rightChild)
{
int N_width = CountWidth(N);
int N_x2, N_y2;
N_y2 = y + N_width / 2;
N_x2 = x + N_width / 2;
if (N > 2)
{
int ChildWidth = CountWidth(N - 1);
x_rightChild = N_x2 - ChildWidth / 2;
y_rightChild = N_y2 - ChildWidth / 2;
}
else
{
x_rightChild = N_x2;
y_rightChild = N_y2;
}
}

int func(int N, int x, int y, const int x1, const int y1, const int x2, const int y2)
{
int count = 0;
if (x > x2)
return 0;
int x_leftChild, y_leftChild;
int x_rightChild, y_rightChild;
CountLeftChild(N, x, y, x_leftChild, y_leftChild);
CountRightChild(N, x, y, x_rightChild, y_rightChild);
if ((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2))
{
count++;
}
if (N > 1)
{
if (y <= y1)
{
count += func(N - 1, x_rightChild, y_rightChild, x1, y1, x2, y2);
}
else
if (y >= y2)
{
count += func(N - 1, x_leftChild, y_leftChild, x1, y1, x2, y2);
}
else
{
count += func(N - 1, x_rightChild, y_rightChild, x1, y1, x2, y2) + func(N - 1, x_leftChild, y_leftChild, x1, y1, x2, y2);
}
}
return count;
}

int main()
{
int N, M;
cin >> N >> M;
while (M--)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << func(N, 0, 0, x1, y1, x2, y2) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: