蛇形數組

蛇形數組,就是讓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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章