codeVS之旅:1160 蛇形矩阵

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xckkcxxck/article/details/83046222

1160 蛇形矩阵    http://codevs.cn/problem/1160/

 时间限制: 1 s

 空间限制: 128000 KB

 题目等级 : 白银 Silver

题解

 查看运行结果

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

数据范围及提示 Data Size & Hint

解答:这个题是一个模拟题,我的解法就是从数组中心开始模拟,按照,右,上,左,下的顺序,走完一次算一轮。每次方向区分使用flag标记。关于每次走多少步,这里我通过找规律发现的,应该是第一轮:右1,上1,左2,下2,。第二轮:右3,上3,左4,下4,可以看到右和上步数和论数k的关系是2*k-1=步数,左和下则是2*k=步数。因为conut是从0开始计数的,就写成了代码中的判断。最后再补足数组的最后一行即可。关于对角线和只需要找出规律进行相加就可以了。

PS:这个题我几度想放弃,可是看了看后面的题解,我感觉还是自己写吧,题解没有写得很详细的,而且其实看别人的答案就感觉自己已经输了的感觉。

代码如下:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[100][100]={0};
    int i=n/2,j=n/2, k,x=1;
    int m=1;
    int count=0;
    int flag=0;
    a[i][j]=m;
    m++;
    for(k=1;k<=n/2;k++ )
    {

        if(flag%4==0)
        {
            count=0;
            while(count<2*k-1)
            {
                j++;
                a[i][j]=m;
                m++;
                count++;
            }
            flag++;
        }
        if(flag%4==1)
        {
            count=0;
            while(count<2*k-1)
            {
                i--;
                a[i][j]=m;
                m++;
                count++;
            }
            flag++;
        }
        if(flag%4==2)
        {
            count=0;
            while(count<=2*k-1)
            {
                j--;
                a[i][j]=m;
                m++;
                count++;
            }
            flag++;
        }
        if(flag%4==3)
        {
            count=0;
            while(count<=2*k-1)
            {
                i++;
                a[i][j]=m;
                m++;
                count++;
            }
            flag++;
        }
    }
    int c = n*n-n+2;
    for(int i=n-1,j=1; j<n; j++)
    {
        a[i][j]= c;
        c++;
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            cout<<a[i][j]<<' ';
        }
        cout<<endl;
    }
    int sum =0;
    for(i=0; i<n; i++)
    {
        sum = sum + a[i][n-i]+a[i][i];
    }
    sum =sum-a[i][i];
    cout<<sum<<endl;


    return 0;
}

猜你喜欢

转载自blog.csdn.net/xckkcxxck/article/details/83046222