codevs 1160 蛇形矩阵

 

 时间限制: 1 s
 空间限制: 128000 KB
 
题目描述  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<cstdio>

#include<cmath>

#include<cctype>

#include<iostream>

#include<vector>

#include<cstring>

#include<algorithm>

#include<map>

#include<set>

#include<cstddef>

#include<sstream>

#include<cstdlib>

#include<stack>

#include<queue>



using namespace std;

//本来想绕圈填数组的 但是发现总是不行。于是就直接输出了

//寻找下标和元素的关系,这是一道数学题。

int main(){

    int n;

    cin >> n;

    if(0 == n % 2) return 0;//虽然数据是不可能含偶数。

    int m, ctr = n/2;

    int sum = 0, t;

    for(int i = 0; i < n; i++) {

        for(int j = 0; j < n; j++) { //按顺序输出

            m = max(abs(i-ctr), abs(j-ctr));//abs是绝对值,

            m = 2 * m + 1;

            if(((ctr-i)==(m-1)/2) || ((ctr-j)==(m-1)/2))

                t = m*m-2*m-j+i+2;

            else if((i-ctr)==(m-1)/2)

                t = m*m-m+1+j-2*ctr+i;

            else

                t = m*m-3*m+3+2*ctr-i-j;

            cout << t << " ";

            if(i==j || (i+j)==(n-1))//对角线

                sum += t;

        }

        cout << endl;

    }

    cout << sum << endl;

    return 0;

}

 

你可能感兴趣的:(code)