面试例题:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?
(中国台湾著名感伤公司2007年11月面试题)
#include <stdio.h>
#include <iostream>
int main()
{
int N;
int s,i,j;
int squa;
scanf("%d",&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)? i : j));
}
}
}for (i=0;i<N; i++)
{
for (j=0; j<N; j++)
{
printf("%6d",a[i][j]);
}
printf("\n");
}
}
这里有一外小问题,就是上面的星号,如果是int型的,结果没有问题。但如果是其它类型结果就去出错。
双重指针要分配内存首先是给*p分配。运行结果如下: