💬推荐一款模拟面试、刷题神器,从基础到大厂面试题👉点击跳转刷题网站进行注册学习
一、问题及想法
[问题] 输出如图4. 3(a)所示NXN(1≤N≤10)的数字旋转方阵。
[想法] 用二维数组 data[N][N]表示NXN的方阵,观察方阵中数字的规律,可以从外层向里层填数,如下图所示。在填数过程中,每一层的起始位置很重要。设变量size表示方阵的大小,则初始时size=N,填完一层则size=size- 2;设变量begin表示每一层的起始位置,变量i和j分别表示行号和列号,则每一层初始时i= begin,j= begin.将每一层的填数过程分为A、B、C和D四个区域,则每个区域需要填写size-1个数字,填写区域A时列号不变行号加1,填写区域B时行号不变列号加1,填写区域C时列号不变行号减1,填写区域D时行号不变列号减1。显然,递归的结束条件是size等于0或size等于1。
二、算法
数字旋转方阵Full
输入:当前层左上角要填的数字number,左上角的坐标begin,方阵的阶数size
输出:数字旋转方阵
1.如果size等于0,则算法结束;
2.如果size等于1,则data[begin][begin]= number,算法结束;
3.初始化行、列下标i= begin, j= begin;
4.重复下述操作size-1次,填写区域A
4.1 data[i]GJ = number; number+t;
4.2 行下标i++;列下标不变;
5.重复下述操作size- 1次,填写区域B
5.1 data[i][j]= number; number++;
5.2行下标不变;列下标j++;
6.重复下述操作size-1次,填写区域C
6.1 data[i][i]= number; number++;
6.2 行下标i- -;列下标不变;
7.重复下述操作size-1 次,填写区域 D
7.1 data[i][j]= number; number++;
7.2 行下标不变,列下标j- -;
8.调用函数Full在size- 2阶方阵中左上角begin+1处从数字number开始填数:
三.代码实现
void show (int arr[6][6],int number,int size,int begain) { //数字方阵
if(size==1) {
arr[begain][begain]=number+1;
return ;
}
if(size==0) {
return ;
}
int i=begain,j=begain;
for (int k=0; k<size-1; k++) {
arr[i][j]=number;
number++;
i++;
}
for (int k=0; k<size-1; k++) {
arr[i][j]=number;
number++;
j++;
}
for (int k=0; k<size-1; k++) {
arr[i][j]=number;
number++;
i--;
}
for (int k=0; k<size-1; k++) {
arr[i][j]=number;
number++;
j--;
}
show(arr,number,size-2,begain+1);
}