题目

源地址:

http://codevs.cn/problem/1160/

理解

一道模拟的,一直在纠结这个规律怎么推。 一开始的想法是,从最中间开始,由1向n*n不断循环,后来发现这个循环有点难写。折腾了很久还是没有写出来,后来通过观察发现,这个矩阵的右下对角线正好满足一个公差为2的等差数列的平方。根据这个分别来完成递加和递减的过程。

代码


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf (1<<28)
#define ll long long int
using namespace std;

#define MAXN 1000

int n,u[MAXN][MAXN],x,y,i,j,t,s=0;

int main(int argc, char const *argv[])
{
    scanf("%d",&n);
    for(i=n/2+1,t=1; i<=n; ++i,t+=2)
    {
        u[i][i]=t*t;
        x=y=i;
        while(y>i-t+1)
            --y,u[x][y]=u[x][y+1]-1;
        while(x>i-t+1)
            --x,u[x][y]=u[x+1][y]-1;
        while(y<i)
            ++y,u[x][y]=u[x][y-1]-1;
        while(x<i-1)
            ++x,u[x][y]=u[x-1][y]-1;
    }
    for(i=1; i<=n; ++i)
    {
        for(j=1; j<=n; ++j)
        {
            printf("%d ",u[i][j]);
            s+=((i==j||i+j==n+1)?u[i][j]:0);
        }
        printf("\n");
    }
    printf("%d",s);
    return 0;
}

更新日志

  • 2014年10月29日 已AC。