四叉树
Memory: 492K |
|
Time: 110MS |
Language: C++ |
|
Result: Accepted |
没能分析出数据的隐藏信息,处理的时候显得很笨重,速度又慢
#include <stdio.h>
#include <string>
using namespace std ;
const int MAXN = 520 ;
const int SIZE = 300000 ;
const char TABLE[16] = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' } ;
//四叉树节点结构
struct NODE
{
char m_flag ; //状态
int m_fpos ; //四个儿子的位置
int m_spos ;
int m_tpos ;
int m_fopos ;
}Msg[SIZE];
int g_MP ;
int N ;
char map[MAXN][MAXN] ;
string RMsg ;
char hexArray[65000] ;
//判断子孙节点的状态
int Analyse( const int& a, const int& b )
{
int mark = 0 ;
if ( a == 1 ){
mark = 5 ;
}
else if ( b == 1 )
{
mark = 1 ;
}
return mark ;
}
//对图像进行分割,记录四叉树的节点信息
int Divide( const int& lx, const int& ly, const int& rx, const int& ry, int& _a, int& _b )
{
_a = _b = 0 ;
if ( lx >= rx ){
Msg[g_MP++].m_flag = '0' ;
if ( map[lx][ly] == '1' )
{
_b = 1 ;
Msg[g_MP++].m_flag = '1' ;
}
else {
Msg[g_MP++].m_flag = '0' ;
}
return g_MP - 2;
}
else {
int a , b , c , d , t , midx , midy ;
int pos = g_MP ;
g_MP++ ;
midx = (( rx + lx ) >> 1) ;
midy = (( ry + ly ) >> 1) ;
Msg[pos].m_fpos = Divide( lx, ly, midx, midy, _a, _b ) ;
a = Analyse( _a, _b ) ;
Msg[pos].m_spos = Divide( lx, midy + 1, midx, ry, _a, _b ) ;
b = Analyse( _a, _b ) ;
Msg[pos].m_tpos = Divide( midx + 1, ly, rx, midy, _a, _b ) ;
c = Analyse( _a, _b ) ;
Msg[pos].m_fopos = Divide( midx + 1, midy + 1, rx, ry, _a, _b ) ;
d = Analyse( _a, _b ) ;
t = a + b + c + d ;
if ( t == 4 ) //全为1
{
_a = 0 ;
_b = 1 ;
Msg[pos].m_flag = '0' ;
Msg[pos + 1].m_flag = '1' ;
g_MP = pos + 2 ;
}
else if ( t == 0 ) //全为0
{
_a = _b = 0 ;
Msg[pos].m_flag = '0' ;
Msg[pos + 1].m_flag = '0' ;
g_MP = pos + 2 ;
}
else if ( t != 0 ) //有分支
{
_a = 1 ;
_b = 0 ;
Msg[pos].m_flag = '1' ;
}
return pos ;
}
}
//转化成四叉树表达式
void Reverse( )
{
const int MAX = 5000 ;
int Q[MAX], h = 0 , t = 1 ;
Q[0] = 0 ;
while ( h != t )
{
int x = Q[h] ;
h = ( h + 1 ) % MAX ;
if ( Msg[x].m_flag == '1' )
{
RMsg = '1' + RMsg ;
Q[t] = Msg[x].m_fpos ;
t = ( t + 1 ) % MAX ;
Q[t] = Msg[x].m_spos ;
t = ( t + 1 ) % MAX ;
Q[t] = Msg[x].m_tpos ;
t = ( t + 1 ) % MAX ;
Q[t] = Msg[x].m_fopos ;
t = ( t + 1 ) % MAX ;
}
else {
RMsg = Msg[x].m_flag + RMsg ;
RMsg = Msg[x + 1].m_flag + RMsg ;
}
}
}
//用16进制表示
void Turn()
{
int i , j , k , m , t ;
k = 0 ;
for ( i = 0 ; i < g_MP ; i += 4 )
{
m = 1 ;
t = 0 ;
for ( j = i ; m <= 8 && j < g_MP ; ++j )
{
t = t + (RMsg.at(j) - '0') * m ;
m = ( m << 1 ) ;
}
hexArray[k++] = TABLE[t] ;
}
for ( i = k - 1 ; i >= 0 ; --i )
{
printf("%c", hexArray[i]) ;
}
printf("\n") ;
}
void Init()
{
g_MP = 0 ;
Msg[0].m_flag = 0 ;
RMsg = "\0" ;
}
void Work()
{
int a, b ;
Divide( 0, 0, N - 1, N - 1 , a, b ) ;
Reverse() ;
Turn() ;
}
int main()
{
int t , i , j ;
// freopen("in.txt", "r", stdin) ;
scanf("%d", &t) ;
while ( t != 0 )
{
scanf("%d", &N) ;
getchar() ;
Init() ;
for ( i = 0 ; i < N ; ++i )
{
for ( j = 0 ; j < N ; ++j )
{
scanf("%c ", &map[i][j]) ;
}
}
Work() ;
t-- ;
}
return 0 ;
}