2007年10月20日星期六

转圈赋值矩阵问题

北电笔试的一个改错题。
打印如下矩阵:
   1   2   3   4   5
  16  17  18  19   6
  15  24  25  20   7
  14  23  22  21   8
  13  12  11  10   9

直接把正确程序贴上来吧。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

void PrintMatrix(int *matrix,int size)
{
  //  output the matrix
  int i;
    for(i=0;i<size;i++)
      { int j;
        for( j=0;j<size;j++)
          {
            printf("%4d",matrix[i*size+j]);
          }
        printf("\n");
      }
  return;
}

void FillMatrix(int *matrix,int size)
{
  int upperBound,lowerBound;
  int index1=0,index2=0;
  int direction=1;
  int number=1;
  int dimensionFlag=0;

  upperBound=size;
  lowerBound=0;
  while(upperBound>=lowerBound)
    {
      int i;
      for( i=0;i<4;i++)
        {
          int j;
          for(  j=lowerBound;j<upperBound;j++)
            {
              matrix[index1*size+index2]=number;
              number++;
              if(j==upperBound-1)
                {
                  dimensionFlag=!dimensionFlag;
                  if(i%2==1)
                    {
                      direction=-direction;
                    }
                }

              if(dimensionFlag)
                index1+=direction;
              else
                index2+=direction;

            }
              if(i%2==0)
                {
                  if(i%4==0)
                    {
                      lowerBound++;
                    }
                  else
                    {
                      upperBound--;
                    }
                }
            }
        }
      return;

}


  int main()
  {
    int MATRIX_SIZE=5;
    int *matrix;
    matrix=(int *)malloc(sizeof(int)*MATRIX_SIZE*MATRIX_SIZE);
    FillMatrix(matrix,MATRIX_SIZE);
    PrintMatrix(matrix,MATRIX_SIZE);
    return 0;
  }

i从0到3对应4个方向,
针对每个方向有dimensionFlag,directrion标识index1,index2该如何前进。
lowerBound,upperBound表明每行或者每列未填充的矩阵元素上下边界。

没有评论: