您的位置:首页 > 职场人生

程序员面试宝典 zigzag数组问题 p92 new二维数组

2015-06-08 15:41 288 查看
由于对同一斜线上的元素,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))

元素值=(N*N-(s1+1)*s1/2)-(N-i)=下一斜线的第一个元素值-该斜线剩余元素的个数

#include<iostream>
using namespace std;
int main()
{
int N=4;
int **a=new int*
;
for(int i=0;i<N;i++)
{
a[i]=new int
;
}

for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
int s=i+j;
if(s<N)    //每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :s*(s+1)/2
a[i][j]=s*(s+1)/2	+	(((i+j)%2!=0)	?	i	:	j);
else
{
s=(N-1-i)+(N-1-j);   //每斜线的元素个数开始减少,等差数组不适用,可以用减法计算,剩余元素的斜线数目:s=(N-1-i)+(N-1-j);
a[i][j]=N*N-s*(s+1)/2	-	 (N- ((i+j)%2!=0?i:j)) ;  //下一斜线的第一个元素值-该斜线剩余元素的个数
}
}

for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<a[i][j]<<"  ";
}
cout<<endl;
}

for(int i=0;i<N;i++)
{
delete []a[i];
}
delete []a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: