螺旋数组

螺旋数组,是将N*N数组如下设置

3*3
123
894
765
4*4
1234
1213145
1116156
10987

5*5
12345
161718196
152425207
142322218
131211109

class HelixLine
{
public:
	enum Direction 
	{
		RIGHT,
		DOWN,
		LEFT,
		UP,
	};
	HelixLine(unsigned int);
	~HelixLine();

	void draw();
	void show();
private:
	unsigned int m_nSize;
	unsigned int* m_map;
};

HelixLine::HelixLine(unsigned int size):
m_nSize(size),
m_map(NULL)
{

}

HelixLine::~HelixLine()
{
	if (NULL!= m_map)
	{
		delete[] m_map;
		m_map = NULL;
	}
}

void HelixLine::draw()
{
	if(NULL == m_map)
	{
		m_map = new unsigned int[m_nSize * m_nSize];
	}
	int x = 0;
	int y = 0;
	//四周边界,每次到达拐点,当前边界向中心靠拢
	int xLeft = -1;
	int xRight = m_nSize;
	int yTop = 0;
	int yBottom = m_nSize;
	//数组值产生器
	int count = 0;
	//方向标志
	Direction d = RIGHT;

	while(count < m_nSize * m_nSize)
	{
		m_map[y * m_nSize + x] = ++count;
		switch(d)
		{
			case RIGHT:
			if (x + 1 == xRight)
			{
				d = DOWN;
				++y;
				--xRight;
			}
			else
			{
				++x;
			}
			break;
			case DOWN:
			if (y + 1 == yBottom)
			{
				d = LEFT;
				--x;
				--yBottom;
			}
			else
			{
				++y;
			}
			break;
			case LEFT:
			if (x -1 == xLeft)
			{
				d = UP;
				--y;
				++xLeft;
			}
			else
			{
				--x;
			}
			break;
			case UP:
			if (y - 1 == yTop)
			{
				d = RIGHT;
				++x;
				++yTop;
			}
			else
			{
				--y;
			}
		}
	}
}

void HelixLine::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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值