规律数组的打印

简介: 打印规律数组实现。

【北京直真笔试题】打印数组如下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 nBase = 1;
         for(int i = 0; i < g_nCnt/2; i++)
         {
                  for(int j = i; j < g_nCnt-i; j++)
                   {
                           nArray[i][j] = nBase++;
                   }
 
                   for(int j = i+1; j < g_nCnt-i; j++)
                   {
                            nArray[j][g_nCnt-i-1] = nBase++;
                   }
 
                   for(int j = g_nCnt-i-2; j >= i; j--)
                   {
                            nArray[g_nCnt-i-1][j] = nBase++;
                   }
 
                   for(int j = g_nCnt-i-2; j > i; j--)
                   {
                            nArray[j][i] = nBase++;
                   }
 
                   if(nSize%2 == 1)
                   {
                           nArray[nSize/2][nSize/2] = nBase;
                   }
         }//end for i
}
 
 
 
//printArray
void 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] << "\t";
                   }//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 nBase = 1;
         for(int i = 0; i < g_nCnt/2; i++)
         {
                   for(int j = i; j < g_nCnt-i; j++)
                  {
                       nArray[j][i] = nBase++;
                   }
 
                   for(int j = i+1; j < g_nCnt-i; j++)
                   {
                       nArray[g_nCnt-i-1][j] = nBase++;
                   }
 
                  for(int j = g_nCnt-i-2; j >= i; j--)
                  {
                        nArray[j][g_nCnt-i-1] = nBase++;
                   }
 
                    for(int j = g_nCnt-i-2; j > i; j--)
                   {
                           nArray[i][j]= nBase++;
 
                   }
 
                   if(nSize%2 == 1)
                   {
                            nArray[nSize/2][nSize/2] = nBase; //N为奇数,最后元素的处理.    
 
                   }
         }//end for i
}

[运行结果]:

image.png
   

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

相关文章
|
9月前
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
|
4天前
|
编译器
数组\数组模拟发牌——显示问题
数组\数组模拟发牌——显示问题
6 1
|
11月前
|
算法 Java
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
73 0
|
8月前
|
C语言
乘法口诀标的打印及解释
打印乘法口诀表可以说是c语言中一个很经典的一个简单程序了。 打印乘法口诀表的第一反应可能会是很难,怎么打印出这么多相乘的数呢。但是仔细想分析和考虑的话,其实很简单。那么我来说一下打印乘法口诀表的思路。
37 0
|
11月前
学C的第十三天【应用多文件的形式实现 三子棋 程序(重点);练习:1. 打印9*9乘法口诀表、2. 求10个整数中的最大值、3. 分数加减交叉计算、4. 数一下 1到 100 的整数中出现了多少个9】
9.数组的应用实例1:三子棋(综合以前学习的知识) 三子棋的实现:(重点都在注释中) 1. 游戏不退出,继续玩下一把(循环) 2. 应用多文件的形式写代码
|
11月前
|
测试技术 编译器 C语言
二维数组之查找鞍点的有无
二维数组之查找鞍点的有无
57 0
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)