i\j | 0 | 1 | 2 | 3 |
0 | 1 | 12 | 11 | 10 |
1 | 2 | 13 | 16 | 9 |
2 | 3 | 14 | 15 | 8 |
3 | 4 | 5 | 6 | 7 |
由上图可知:
i行,j列
向下是由0~n-i-1 ,列不变,行增加
向左是由0~n-i-1,行不变,列增加
向上是由n-i-1~0, 列不变,行增加
向右是由n-i-1~0,行不变,列增加
蛮力算法:
#include <stdio.h>
void show(int arr[][5],int n){
int i=0,j=0;
for(i=0;i<n;i++){
for (j=0;j<n;j++)
printf("%-4d", arr[i][j]);
printf("\n");
}
}
void Backward(int test[][5],int n){ //逆时针
int i, j, k;
k = 1;
for (i = 0; i < n / 2; i++){ //n-i-1为边界,注意观察元素下标的行列值都是首尾连续的
for (j = i; j < n - i - 1; j++){ //向下
test[j][i] = k++;
}
for (j = i; j < n - i - 1; j++){ //向右
test[n-i-1][j] =k++;
}
for (j = n - i - 1; j > i; j--){ //向上
test[j][n-i-1] = k++;
}
for (j = n - i - 1; j > i; j--){ //向左
test[i][j] = k++;
}
}
if (n % 2 == 1)//当n为奇数时,需要独立为最中心元素赋值
test[(n-1)/ 2][(n-1) / 2] = k++;
}
int main(){
int n ;
scanf("%d",&n);
int test[n][n];
Backward(test,n);
show(test,n);
return 0;
}
运行结果