输出N×N的zigzag数组 算法思想 代码如下
/* 0 1 5 6 14 15 27 28
2 4 7 13 16 26 29 42
3 8 12 17 25 30 41 43
9 11 18 24 31 40 44 53
10 19 23 32 39 45 52 54
20 22 33 38 46 51 55 60
21 34 37 47 50 56 59 61
35 36 48 49 57 58 62 63
*/
#include <iostream>
using namespace std;
int main()
{
int N;
int s,i,j;
int squa;
cin>>N;
int **a = (int **) malloc(N*sizeof(int));
if(a == NULL)
return 0;
for(i=0;i<N;i++)
{
if((a[i] = (int *)malloc(N*sizeof(int)))==NULL)
{
while(--i>=0)
free(a[i]);
free(a);
return 0;
}
}
squa = N*N;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
s = i+j;
if(s<N)
a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)?i:j); //基于什么样的思想,说明一下
else
{
s = (N-1-i) + (N-1-j);
a[i][j] = squa -s*(s+1)/2-(N-(((i+j)%2 == 0)?i:j));//基于什么样的思想,说明一下
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%6d",a[j][i]);
printf("\n");
}
return 0;
}