题目描述 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

 
通过一个结构体来控制方向,从最底层开始填充:
 
 
#include<iostream>
using namespace std;

class pos {
public:
    int x;
    int y;

};


int a[105][105] = { 0 };

int main()
{
    pos p[4];
    p[0].x = -1;
    p[0].y = 0;
    p[1].x = 0;
    p[1].y = -1;
    p[2].x = 1;
    p[2].y = 0;
    p[3].x = 0;
    p[3].y = 1;
    int T, t, x, y;
    cin >> T;
    int sum = T*T;
    t = 0;
    x = T;
    y = T;
    a[T][T] = sum--;
    for (; sum > 0; sum--) {
        if (a[x + p[t % 4].x][y + p[t % 4].y] == 0 && x + p[t % 4].x > 0 && x + p[t % 4].x <= T && y + p[t % 4].y > 0 && y + p[t % 4].y <= T )
            a[x += p[t % 4].x][y += p[t % 4].y] = sum;
        else {
            t++;
            a[x += p[t % 4].x][y += p[t % 4].y] = sum;
        }
    }
    for (int i = 1; i <= T; i++)
    {
        for (int j = 1; j <= T; j++)
            cout << a[j][i]<<" ";
        cout << endl;
    }
    for (int i = 1; i <= T; i++)
        sum += a[i][i]+a[i][T-i];
    cout << sum << endl;
    return 0;
}

 

posted on 2017-10-08 11:01  郑哲  阅读(152)  评论(0编辑  收藏  举报