【北京直真笔试题】打印数组如下44数组,要求打印NN的数组?

1  12  11  10

2  13  16  9

3  14  15  8

4   5   6  7

【思路】:

 image.png

1.发现规律

如上图所示,仔细发现是有规律的,先第1、2、3、4步骤;我们发现第5、6、7…步骤和前面的1、2、3、4步骤是相同的,只是边界值不同。

2.考虑实现

实现的问题转换为先定义二维数组,数组的元素为0.然后的操作就是填值的过程。边界值的确定采用层层剥离的思想。我们容易看出循环的次数正是N/2次。存在当N为奇数时需要单独处理最后一个数的情况。

【算法实现】:

//design[思想:层层剥离.]

void designArray(int nArray[][g_nCnt], int nSize){        int n  = 1;         for(int i = 0; i < g_nCnt/2; i++)         {                  for(int j = i; j < g_nCnt-i; j++)                   {                           nArray[i][j] = n ++;                   }                    for(int j = i+1; j < g_nCnt-i; j++)                   {                            nArray[j][g_nCnt-i-1] = n ++;                   }                    for(int j = g_nCnt-i-2; j >= i; j--)                   {                            nArray[g_nCnt-i-1][j] = n ++;                   }                    for(int j = g_nCnt-i-2; j > i; j--)                   {                            nArray[j][i] = n ++;                   }                    if(nSize%2 == 1)                   {                           nArray[nSize/2][nSize/2] = n ;                   }         }//end for i}   //printArrayvoid printArray(int nArray[][g_nCnt], int nSize){        static int s_nCnt = 0;         cout << "----------------------DESIGN " << ++s_nCnt ;         cout << "----------------------"  << endl;         for(int i=0; i <nSize; i++)         {                  for(int j =0; j < nSize; j++)                   {                      cout << nArray[i][j] << "	";                   }//end for j                   cout << endl;         }//end for i         cout << "----------------------DESIGN " << s_nCnt ;         cout << "----------------------"  << endl;          cout << endl << endl;}     void designArray_t(int nArray[][g_nCnt], int nSize){         int n  = 1;         for(int i = 0; i < g_nCnt/2; i++)         {                   for(int j = i; j < g_nCnt-i; j++)                  {                       nArray[j][i] = n ++;                   }                    for(int j = i+1; j < g_nCnt-i; j++)                   {                       nArray[g_nCnt-i-1][j] = n ++;                   }                   for(int j = g_nCnt-i-2; j >= i; j--)                  {                        nArray[j][g_nCnt-i-1] = n ++;                   }                     for(int j = g_nCnt-i-2; j > i; j--)                   {                           nArray[i][j]= n ++;                    }                    if(nSize%2 == 1)                   {                            nArray[nSize/2][nSize/2] = n ; //N为奇数,最后元素的处理.                        }         }//end for i}

[运行结果]:

image.png
   

或者大家还有什么好的思路,欢迎交流探讨!

收藏 打印