📄 honeyhole.h
字号:
#ifndef __cxj_HoneyHole_h
#define __cxj_HoneyHole_h
class CHoneyHole
{
protected:
int _No;
void No_to_FSO ( int N, int& F, int& S, int& O );
void FSO_to_XY ( int F, int S, int o, int& X, int& Y );
void XY_to_FSO ( int X, int Y, int& F, int& S, int& O );
void FSO_to_No ( int F, int S, int O, int& N );
public:
CHoneyHole () { set (); }
CHoneyHole ( const CHoneyHole& H ) { set (H); }
CHoneyHole ( int N ) { set (N); }
CHoneyHole ( int X, int Y ) { set (X, Y); }
CHoneyHole ( int F, int S, int O ) { set (F, S, O); }
~CHoneyHole() {}
operator int ( ) { return _No; }
int set ( const CHoneyHole& H );
int set ( int N=0 );
int set ( int X, int Y );
int set ( int F, int S, int O );
int get ();
int get ( int& N );
int get ( int& X, int& Y );
int get ( int& F, int& S, int& O );
int distance ( CHoneyHole H );
int move ( int dir, int step = 1 );
int turn ( int a = 1 );
};
int CHoneyHole::set( const CHoneyHole& H )
{
return _No = H._No;
}
int CHoneyHole::set( int N )
{
return _No = N < 0 ? 0 : N;
}
int CHoneyHole::set( int X, int Y )
{
int F, S, O, N;
XY_to_FSO (X, Y, F, S, O);
FSO_to_No (F, S, O, N);
return _No = N;
}
int CHoneyHole::set( int F, int S, int O )
{
int N;
FSO_to_No (F, S, O, N);
return _No = N;
}
int CHoneyHole::get()
{
return _No;
}
int CHoneyHole::get( int& N )
{
return N = _No;
}
int CHoneyHole::get( int& X, int& Y )
{
int F, S, O;
No_to_FSO (_No, F, S, O);
FSO_to_XY (F, S, O, X, Y);
return _No;
}
int CHoneyHole::get( int& F, int& S, int& O )
{
No_to_FSO (_No, F, S, O);
return _No;
}
int CHoneyHole::distance( CHoneyHole h = CHoneyHole() )
{
int x, y, x1, y1;
get (x, y);
h.get (x1, y1);
x -= x1;
y -= y1;
CHoneyHole d(x, y);
int f, s, o;
d.get (f, s, o);
return f;
}
int CHoneyHole::move( int dir, int step )
{
int x, y;
get (x, y);
switch( dir )
{
case 0: x += step; break;
case 1: x += step; y += step; break;
case 2: y += step; break;
case 3: x -= step; break;
case 4: x -= step; y -= step; break;
case 5: y -= step; break;
default:
return -1;
}
return set (x, y);
}
int CHoneyHole::turn( int a )
{
int f, s, o;
get (f, s, o);
s += a % 6 + 6;
s %= 6;
return set (f, s, o);
}
void CHoneyHole::No_to_FSO ( int N , int& F , int& S , int& O )
{
if( N == 0 ) // if No equal 0
{
F = 0;
S = 0;
O = 0;
return ;
}
int f , s , o;
f = 0;
while( ( f+1 ) * f * 3 < N )
f++;
s = ( ( f+1 ) * f * 3 - N ) / f;
o = ( ( f+1 ) * f * 3 - N - s * f ) % f;
F = f;
S = s;
O = o;
}
void CHoneyHole::FSO_to_No ( int F , int S , int O , int& N )
{
N = ( F+1 ) * F * 3 - S * F - O;
}
void CHoneyHole::FSO_to_XY ( int F , int S , int O , int& X , int& Y )
{
if( F == 0 ) // if No equal 0
{
X = 0;
Y = 0;
return ;
}
int x , y;
switch( S )
{
case 0: x = F; y = O; break;
case 1: x = F - O; y = F; break;
case 2: x = - O; y = F - O; break;
case 3: x = - F; y = - O; break;
case 4: x = - F + O; y = - F; break;
case 5: x = O; y = - F + O; break;
}
X = x;
Y = y;
}
void CHoneyHole::XY_to_FSO ( int X , int Y , int& F , int& S , int& O )
{
if( !X && !Y ) // if X==0 and Y==0
{
F = 0;
S = 0;
O = 0;
return ;
}
int f , s , o;
if ( ( Y >= 0 ) && ( X > Y ) ) // get the value of S
s = 0;
else if( ( X > 0 ) && ( Y >= X ) )
s = 1;
else if( ( Y > 0 ) && ( X <= 0 ) )
s = 2;
else if( ( Y <= 0 ) && ( Y > X ) )
s = 3;
else if( ( X < 0 ) && ( X >= Y ) )
s = 4;
else if( ( Y < 0 ) && ( X >= 0 ) )
s = 5;
switch( s )
{
case 0: f = X; o = Y; break;
case 1: f = Y; o = Y - X; break;
case 2: f = Y - X; o = - X; break;
case 3: f = - X; o = - Y; break;
case 4: f = - Y; o = X - Y; break;
case 5: f = X - Y; o = X; break;
}
F = f;
S = s;
O = o;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -