首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问个面试宝典下面的简单有关问题(急)

2013-03-06 
问个面试宝典上面的简单问题(急)、输入n,求一个n*n矩阵,规定矩阵沿45度线递增(威盛)/** * 得到如下样式的二

问个面试宝典上面的简单问题(急)
、输入n,求一个n*n矩阵,规定矩阵沿45度线递增(威盛)
/**
 * 得到如下样式的二维数组
* zigzag(jpeg编码里取象素数据的排列顺序)
*
*   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
 */
void zigzag(int n)
{
 int **a =(int**) malloc(n*sizeof(int *));  //分配空间
 
 if(NULL == a)
  return ;
 int i;
 for(i = 0; i < n; i++) {
        if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
            while(--i>=0)
                free(a[i]);
            free(a);
            return;
        }
    }
 
 bool flag = false; //这个标志位用来判断是从45度角生成还是225度角生成
 int count = 0;
 for(i=0; i<n; i++)  //生成的上半部分的数据
 {
  
  if(flag)
  {
   for(int r = 0; r<=i; r++)
   {
    a[r][i-r] = count;
    count++;
   }
   flag = false;
  }
  else
  {
   for(int r = i; r>=0; r--)
   {
    a[r][i-r] = count;
    count++;
   }
   flag = true;
  }
 }
 for(i=n-1; i>=0; i--)  //生成的是下半部分的数据
 {
 // cout<<i<<endl;
  if(flag)
  {
   for(int r = 0; r<=i-1; r++)
   {
    int r1 = n-i+r;       //代表当前行
    int c1 = 2*n-i-1-r1;  //代表当前列
    a[r1][c1] = count;
    count++;
   }
   flag = false;
  }
  else
  {
   for(int r = i-1; r>=0; r--)
   {
    cout<<"ddd"<<endl;
    int r1 = n-i+r;
    int c1 = 2*n-i-1-r1;
 //   cout<<r1<<","<<c1<<endl;
    a[r1][c1] = count;
    count++;
   }
   flag = true;
  }
 }
 for(int r = 0; r<n; r++)
 {
  for(int c=0; c<n; c++)
   cout<<a[r][c]<<",";
  cout<<endl;
 }
}
int main()
{
 int n;
 cin>>n;
 zigzag(n);
 return 0;


}
这里想问的问题:非常简单,就是问下int **a =(int**) malloc(n*sizeof(int *));  //分配空间
 
 if(NULL == a)
  return ;
 int i;
 for(i = 0; i < n; i++) {
        if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
            while(--i>=0)
                free(a[i]);
            free(a);
            return;
        }
    }
这几行代码是什么意思,麻烦说的详细些?
[解决办法]

int **a =(int**) malloc(n*sizeof(int *));  

为指向int型指针的指针分配空间,该指针指向n个型指针。
if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {

对于前面的指针的每个值(int指针)赋值,使其指向一个int数组,如果分配失败,则释放在它之前申请成功的空间
[解决办法]
malloc分配空间失败的话,释放之前分配的空间

热点排行