蛇形数组,就是让n*n的数组设置为如下值:
3*3:
1 2 6
3 5 7
4 8 9
4*4:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
5*5:
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
蛇形图初始方向向右,之后方向转换图如下
代码如下
class SnakingLine
{
public:
enum direction
{
RIGHT,
LEFTDOWN,
DOWN,
RIGHTUP,
};
SnakingLine(unsigned int);
~SnakingLine();
void draw();
void show();
private:
unsigned int m_nSize;
unsigned int* m_map;
};
SnakingLine::SnakingLine(unsigned int size):
m_nSize(size),
m_map(NULL)
{
}
SnakingLine::~SnakingLine()
{
if (NULL!= m_map)
{
delete[] m_map;
m_map = NULL;
}
}
void SnakingLine::draw()
{
if(NULL == m_map)
{
m_map = new unsigned int[m_nSize*m_nSize];
}
int x = 0;
int y = 0;
unsigned counter = 0;
direction d = RIGHT;
m_map[y * m_nSize + x] = ++counter;
while(counter < m_nSize * m_nSize)
{
switch(d)
{
case RIGHT:
++x;
if (y == m_nSize -1)
{
d = RIGHTUP;
}
else if(y == 0)
{
d = LEFTDOWN;
}
break;
case LEFTDOWN:
--x;++y;
if (y + 2 > m_nSize)
{
d = RIGHT;
}
else if (x < 1)
{
d = DOWN;
}
break;
case DOWN:
++y;
if (x < 1)
{
d = RIGHTUP;
}
else if (x + 2 > m_nSize)
{
d = LEFTDOWN;
}
break;
case RIGHTUP:
++x;--y;
if (x + 2 > m_nSize)
{
d = DOWN;
}
else if(y < 1)
{
d = RIGHT;
}
break;
}
m_map[y * m_nSize + x] = ++counter;
}
}
void SnakingLine::show()
{
for(int i = 0; i < m_nSize * m_nSize; ++i)
{
if (i % m_nSize == 0)
{
cout << endl;
/* code */
}
cout << m_map[i] << '\t';
}
cout << endl;
}