题目:这个蛇形方阵大家都知道吧?不知道就看下面的矩阵找规律
蛇形方阵
【问题描述】
输入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;
}
原文:http://www.cnblogs.com/leonqqs/p/7470724.html