题目描述
Description
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.
输入描述 Input Description
n(即n行n列)
输出描述 Output Description
n+1行,n行为组成的矩阵,最后一行为对角线数字之和
样例输入 Sample Input
3
样例输出 Sample Output
5 4 3
6 1 2
7 8 9
25
有意思的题目,x,y代表4个方向:#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> int x[4]={0,-1,0,1}; int y[4]={-1,0,1,0}; using namespace std; int main() { int n; int m[110][110]; while (~scanf("%d",&n)) { memset(m,0,sizeof(m)); m[n][n]=n*n; int i=n,j=n; int s=n*n-1; int t=0; int ans=n*n; while (s) { if (i+x[t]==0 || j+y[t]==0 || j+y[t]>n || m[i+x[t]][j+y[t]]!=0) t=(t+1) % 4; i+=x[t]; j+=y[t]; m[i][j]=s; if (i==j || i==(n-j+1)) ans+=s; s--; } for (i=1;i<=n;i++) { for (j=1;j<n;j++) printf("%d ",m[i][j]); printf("%d\n",m[i][n]); } printf("%d\n",ans); } return 0; }