给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。
#include <stdio.h>
int data[100][100];
int begin = 0;
void Full(int number, int size) {
//从numbe开始填写size阶方阵,左上角下标(begin,begin)
int i, j, k;
if (size == 0) {//递归的边界条件,如果size=0则无需填写
return;
}
if (size == 1) {//递归的边界条件,如果size=1
data[begin][begin] = number;//则只需填写number一个数
return;
}
i = begin;//初始化左上角下标
j = begin;
for (k = 0; k < size - 1; k++) {//填写区域A,共填写size-1个数
data[i][j] = number;//在当前位置填写number
number++;
i++;//行下标加1
}
for (k = 0; k < size - 1; k++) {//填写区域B,共填写size-1个数
data[i][j] = number;//在当前位置填写number
number++;
j++;//列下标加1
}
for (k = 0; k < size - 1; k++) {//填写区域C,共填写size-1个数
data[i][j] = number;//在当前位置填写number
number++;
i--;//行下标减1
}
for (k = 0; k < size - 1; k++) {//填写区域D,共填写size-1个数
data[i][j] = number;//在当前位置填写number
number++;
j--;//列下标减1
}
begin++;//左上角下标为begin+1
Full(number, size - 2);//递归求解
}
int main() {
int number, size;
printf("请输入当前层左上角要填的数字:");
scanf("%d", &number);
printf("请输入方阵的阶数:");
scanf("%d", &size);
Full(number, 6);
printf("以下是输出的%d阶数字旋转矩阵:\n", size);
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
printf("%2d ", data[i][j]);
}
printf("\n");
}
}
算法时间复杂度如下:
n阶方阵:
如果n = 0时,T(n) = 0;
如果n = 1时,T(n) = 1;
如果n > 1时,T(n) = O(n^2);