// 四个方向,分别表示下 左 上 右
int dir[4][2] = { {+1, 0}, {0, -1}, {-1, 0}, {0, +1}};
int dir_now = 0; // 当前的方向
int len = N; // 每个方向要写的数值
bool lensub = true; // 表示变更方向时是否要减小len的值
int x = -1, y = N-1; // 开始位置
int num = 0; // 不说了
while (len)
{
for ( int i=0; i<len; i++) // 每一轮有 len 个数被赋值
{
x += dir[dir_now][0]; // 在 x 方向上的偏移
y += dir[dir_now][1]; // 在 y 方向上的偏移
arr[x][y] = ++num; // 确定位置并赋值
//printf(" [%2d, %2d] ", x, y);
}
if (lensub) len --; // 确定是否要将len的值减小
lensub = !lensub; // 反转状态,表示每两次减小一次len值
//printf("\n");
dir_now = ++dir_now%4; // 改变方向
}
// 打印结果
for (int i=0; i<N; i++)
{
for (int j=0; j<N; j++) printf(" %3d", arr[i][j]);
printf("\n");
}
}
////HelixArray
#include <iostream.h>
////
class CHelixArray
{
unsigned int m_nRank;
int m_nFirstValue,m_nLastValue;
int m_nStep;
int m_nClockwise;
int *m_pArray;
public:
CHelixArray(unsigned int nRank,int nFirstValue=1,int nStep=1,int nClockwise=1);
CHelixArray(CHelixArray& aHelixArray);
CHelixArray();
virtual ~CHelixArray();
////
public:
unsigned int SetRank(unsigned int nRank);
unsigned int GetRank();
int RankChanged();
int IsValid();
int SetFirstValue(int nFirstValue);
int GetFirstValue();
int GetLastValue();
int SetStep(int nStep);
int GetStep();
int SetClockwise(int nClockwise=1);
int IsClockwise();
virtual int Initialize();
int Display();
private:
int InitialClockwise();
int InitialAnticlockwise();
};
CHelixArray::CHelixArray(unsigned int nRank,int nFirstValue,int nStep,int nClockwise)
{
m_nRank=nRank;
m_nFirstValue=m_nLastValue=nFirstValue;
m_nStep=nStep;
m_nClockwise=nClockwise;
m_pArray=NULL;
}
CHelixArray::CHelixArray(CHelixArray& aHelixArray)
{
}
CHelixArray::CHelixArray()
{
m_nRank=0;
m_nFirstValue=m_nLastValue=0;
m_nStep=1;
m_nClockwise=1;
m_pArray=NULL;
}
CHelixArray::~CHelixArray()
{
if(m_pArray)
{
delete[] m_pArray;
m_pArray=NULL;
}
}
int CHelixArray::Initialize()
{
if(!IsValid())return 0;