#include <stdio.h>
#include <stdlib.h>
static void setArr(int **arr,int readNum);
static void printArr(int **arr,int num);
int main()
{
???? int readNum = 0;
???? scanf("%d",&readNum);
???? getchar();
????
???? int **arr = (int**)malloc(sizeof(int*)*readNum);
???? int rowIndex = 0;
???? for(;rowIndex < readNum;++rowIndex)
???? {
????????? arr[rowIndex] = (int*)malloc(sizeof(int)*readNum);
???? }
????
???? setArr(arr,readNum);
???? printArr(arr,readNum);
?????????
???? rowIndex = 0;
???? for(;rowIndex < readNum;++rowIndex)
???? {
????????? free(arr[rowIndex]);
???? }
???? free(arr);
????
????
???? return 0;
}
static void setArr(int **arr,int readNum)
{
???? int i=0;
???? int flag = readNum;
???? int colIndex = readNum-1;
???? int rowIndex = 0;
???? int maxNum = readNum*readNum;
???? while(i<maxNum) //如果是偶数,则最大一个值在上侧执行完毕后就结束了
???? {
????????? colIndex = flag-1;
?????????
????????? if(i == maxNum-1)
//如果是奇数方阵,则最后一个数是最后一个最大值,特殊处理后结束
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
?????????????? break;
????????? }
?????????
????????? //右侧,行+,列不变
????????? for(;rowIndex<flag-1 && i<=maxNum;++rowIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //下侧,行不变 列-
????????? for(;colIndex>readNum-flag && i<=maxNum;--colIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //左侧,行-,列不变
????????? for(;rowIndex>readNum-flag && i<=maxNum;--rowIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? //上侧,行不变,列++
????????? for(;colIndex<flag-1 && i<=maxNum;++colIndex)
????????? {
?????????????? arr[rowIndex][colIndex] = ++i;
????????? }
?????????
????????? --flag;
????????? ++rowIndex;
???? }
}
static void printArr(int **arr,int num)
{
???? int???? rowIndex = 0;
???? for(;rowIndex<num;++rowIndex)
???? {
????????? int colIndex = 0;
????????? for(;colIndex < num;++colIndex)
????????? {
?????????????? printf("%d ",arr[rowIndex][colIndex]);
????????? }
????????? printf("\n");
???? }
}