问题描述
以1为中心,用2,3,4, …, n, …, n*n的数字围绕着中心输出数圈, 如若n=4,则
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
输入形式
一个整数n(1<=n<=10)
输出形式
数圈矩阵
样例输入
5
样例输出
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
参考代码
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int res[n][n];//矩阵
int sx,sy;//起始位置res[sx][sy]
int loop=n/2;//循环次数
int count=n*n;//起始数为n*n,从大到小赋值
int offset=1;//偏移量
int i,j;
if(n%2) {//n为奇数
sx=0;sy=n-1;//此时起始位置在右上角
while(loop--) {//while执行循环次数
for(j=sy; j>sy-n+offset; j--) res[sx][j]=count--;//从右向左
for(i=sx; i<sx+n-offset; i++) res[i][j]=count--;//从上到下
for(; j<sy; j++) res[i][j]=count--;//从左到右
for(; i>sx; i--) res[i][j]=count--;//从下到上
sx++;sy--;//变更起始位置
offset+=2;//更新偏移量
}
res[n/2][n/2]=1;//n为奇数时,中心位置不在循环里,要单独赋值
} else {//n为偶数
sx=n-1;sy=0;//此时起始位置在左下角
while(loop--) {//while执行循环次数
for(j=sy; j<sy+n-offset; j++) res[sx][j]=count--;//从左到右
for(i=sx; i>sx-n+offset; i--) res[i][j]=count--;//从下到上
for(; j>sy; j--) res[i][j]=count--;//从右向左
for(; i<sx; i++) res[i][j]=count--;//从上到下
sx--;sy++;//变更起始位置
offset+=2;//更新偏移量
}
}
for(int x=0; x<n; x++) {
for(int y=0; y<n; y++) {
cout<<res[x][y]<<" ";//输出矩阵
}
cout<<endl;
}
}