面试题(来自程序员面试宝典)

面试例题:输入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分配。运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值