码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 1160 蛇形矩阵

时间:2015-04-30 21:37:43      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

 

 时间限制: 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;
}

 

codevs 1160 蛇形矩阵

标签:

原文地址:http://www.cnblogs.com/liangyongrui/p/4469721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!