포크 트리 @POJ1610 Quad Trees
7966 단어 tree
이 문제는 N*N의 그림을 주고 이 그림에 네 갈래 나무를 만들어 인코딩용 나무를 구성하는 것이다.이 네 갈래 나무를 구축하는 복잡도는 O(M), M=N^2, M은 그림의 원소의 개수, 복잡도 단계와 네 갈래 나무 노드의 수는 선형 관계가 된다. 나머지는 본 문제에 대해 시뮬레이션이다. 코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int MAXN = 600;
class CNODE
{
public:
int X, Y, E;
int flag, num;
public:
CNODE() {}
CNODE(int _x, int _y, int _e, int _f, int _n)
: X(_x), Y(_y), E(_e), flag(_f), num(_n) {}
}node[MAXN * MAXN * 2];
int bin_map[MAXN][MAXN];
class CQUADTREE
{
public:
public:
CQUADTREE() {}
void Build(int r, int x, int y, int e)
{
if(e > 1)
{
Build(4 * r - 2, x, y, e / 2);
Build(4 * r - 1, x, y + e / 2, e / 2);
Build(4 * r, x + e / 2, y, e / 2);
Build(4 * r + 1, x + e / 2, y + e / 2, e / 2);
int i, judge = 0;
for(i = 4 * r - 2; i < 4 * r + 2; i++)
{
if(node[i].flag) break;
judge |= (1 << node[i].num);
if(judge == 3) break;
}
if(i < 4 * r + 2) node[r] = CNODE(x, y, e, 1, -1);
else node[r] = CNODE(x, y, e, 0, bin_map[x][y]);
}
else //
{
node[r] = CNODE(x, y, e, 0, bin_map[x][y]);
}
}
};
void go(int n)
{
CQUADTREE tree;
tree.Build(1, 0, 0, n);
vector<int> Q;
string ans = "";
Q.push_back(1);
for(int i = 0; i < Q.size(); i++)
{
if(node[Q[i]].flag)
{
ans += "1";
for(int j = 4 * Q[i] - 2; j < 4 * Q[i] + 2; j++)
Q.push_back(j);
}
else
{
ans += "0";
if(node[Q[i]].num) ans += "1";
else ans += "0";
}
}
//cout << ans << endl;
while(ans.length() % 4) ans = "0" + ans;
for(int i = 0; i < ans.length(); i += 4)
{
int tmp = 8 * (ans[i] - '0') +
4 * (ans[i + 1] - '0') +
2 * (ans[i + 2] - '0') +
1 * (ans[i + 3] - '0');
printf("%X", tmp);
}
printf("
");
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &bin_map[i][j]);
go(n);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Lowest Common Ancestor (LCA)Tree에서 두 nodes u와 v의 LCA는, root로부터 가장 멀리(deepest) 있는 공통 조상이다. Naive 하게 root에서 각 node까지의 경로를 비교하여 풀 수 있다. 두 배열을 비교하여 얻은 공...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.