由于对同一斜线上的元素,s=i+j为常数
1.对于第n个(n<N)斜线:
每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :
(s+1)*s/2
斜线中的任意元素可表示为s*(s+1)/2+i
2.同理对于第n个(n>=N)的斜线:
每斜线的元素个数开始减少,等差数组不适用,为方便起见,可以用减法计算元素个数,
剩余元素的斜线数目:s1=(2(N-1)-(i+j))
1.对于第n个(n<N)斜线:
每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :
(s+1)*s/2
斜线中的任意元素可表示为s*(s+1)/2+i
2.同理对于第n个(n>=N)的斜线:
每斜线的元素个数开始减少,等差数组不适用,为方便起见,可以用减法计算元素个数,
剩余元素的斜线数目:s1=(2(N-1)-(i+j))
元素值=(N*N-(s1+1)*s1/2)-(N-i)=下一斜线的第一个元素值-该斜线剩余元素的个数
#include<iostream>
using namespace std;
class ZigArray
{
public:
ZigArray();
ZigArray(int);
void PrintZigArray();
~ZigArray();
private :
int n;
int **z;
};
ZigArray::ZigArray(int num):n(num)
{
z = new int*[n];
for(int i=0;i<n;i++)
{
z[i] = new int[n];
}
int squa = n * n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int s = i+j;
if(s<n)
//此处将程序员面试宝典中的"=="改为了“!=”
z[i][j] = s*(s+1)/2 + (((i+j)%2)!=0?i:j);
else
{
s = (n-1-i)+(n-1-j);
//此处将程序员面试宝典中的"=="改为了“!=”
z[i][j] = squa - s*(s+1)/2 - (n-(((i+j)%2!=0)?i:j));
}
}
}
}
void ZigArray::PrintZigArray()
{
cout<<"*****************************************************************************"<<endl;
for(int i =0;i<n;i++)
{
cout<<" "<<endl;
for(int j =0 ;j<n;j++)
{
cout<<" "<<z[i][j];
}
cout<<endl;
}
cout<<endl<<"*****************************************************************************"<<endl;
}
ZigArray::~ZigArray()
{
for(int i=0;i<n;i++)
{
delete []z[i];
}
delete[] z;
}
void main()
{
ZigArray zArray(8);
zArray.PrintZigArray();
}