defpalace_map(n):# 先全部初始化为 0
matrix =[[0]*(n)for i inrange(n)]# 首先先固定最后一行的中间为 1
row = n -1
col = n //2
matrix[row][col]=1# 循环,所有的值,1 的位置已经放好, 2 到 n * n 二维数组所有的值for i inrange(2, n * n +1):# + 1 求余,获取下一个(row, col) 位置开始,取余数,为了处理row、col大于 n 的数
re_row =(row +1)% n
re_col =(col +1)% n
# 如果下一个位置没有放置数,则可以放置,if(matrix[re_row][re_col]==0):
row = re_row
col = re_col
# 否则放在它的行上面,+ n 又求余,是为了处理row - 1 为负数.else:
row =(row -1+ n)% n
# 注意 row,col 都是从下标 0 开始的。
matrix[row][col]= i
# 打印输出for x in matrix:print(x)
二、C++ 代码实现
#include<iostream>#include<string.h>
using namespace std;voidpalace_map(int n){// 初始化int a[n][n];int row = n -1;int col = n /2;int re_row =0;int re_col =0;// 初始化二维数组元素全部为0memset(a,0,sizeof(a));
a[row][col]=1;// 处理2 到 n * n 的数 for(int i =2; i <(n * n +1); i++){
re_row =(row +1)% n;
re_col =(col +1)% n;if(a[re_row][re_col]==0){
row = re_row;
col = re_col;}else{
row =(row -1+ n)% n;}
a[row][col]= i;}// 打印输出for(int(*p)[n]= a; p != a + n;++p){for(int*q =*p; q !=*p + n;++q){
cout <<*q <<' ';}
cout << endl;}}intmain(int argc,char**argv){palace_map(3);return0;}