蛇形矩阵

题目:这个蛇形方阵大家都知道吧?不知道就看下面的矩阵找规律

蛇形方阵

【问题描述】

输入n,n≤100。输出n阶蛇形方阵。例如n=5时,输出如下:

1        2        6        7       15

 3        5        8       14       16

 4        9       13       17       22

10       12       18       21       23

11       19       20       24       25

算法:

1、那个先说一下,最近学了STL库的动态数组,是用这个编的(STL动态数组vector),有一些句子可以用后面注释着的替换,请各位原谅。

2、本算法就是纯模拟,没有用任何优化,各路高手请勿吐槽。

3、其实这个东西用心还是能找到规律的,当x、y坐标都为奇数或都为偶数时,往↗右上走,撞墙就往右或下走;

当x、y坐标一奇一偶时,往↙左下走,撞墙就往下或右走;(右或下 和 下或右是不一样的,右或下是不能右再下,反之亦然)

标程:

#include<bits/stdc++.h>
using namespace std;
int i,j,zi,n;
int main()
{
    scanf("%d",&n);
    vector<vector<int> >a;//就是定义一个数组a,可以写为:int a[10000][100000];
    a.resize(n);//这个要是用int a[][]定义,就不要了。
    for (i=0;i<n;i++)a[i].resize(n);//这个要是用int a[][]定义,就不要了。
    i=0;j=0;zi=0;
    while(zi<n*n)
    {
        zi++;
        a[i][j]=zi;
        if ((i%2==0&&j%2==0)||(i%2==1&&j%2==1))
        {
            if (j!=n-1)
            {
                i-=1;
                j+=1;
            }
            else
            {
                i+=1;
            }
        }
        else
        if (((i%2==0)&&(j%2==1))||((i%2==1)&&(j%2==0)))
        {
            if (i!=n-1)
            {
                i+=1;
                j-=1;
            }
            else
            {
                j+=1;
            }
        }
        if(i<0)i=0;
        if (j<0)j=0;
    }
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            cout<<setw(5)<<a[i][j];//场宽输出,这个就是输出那个数,不足补空格
        }
        cout<<endl;
    }
    return 0;
}

posted @ 2017-09-03 20:18  Leonqqs  阅读(1454)  评论(1编辑  收藏  举报