蛇形矩阵

题目描述
给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:
输入一行,包含一个整数n
输出描述:
输出n行,每行包含n个正整数,通过空格分隔。

1<=n<=1000

输入样例:
4

输出样例:

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

思路: 蛇形三角形和蛇形填数的升级版,多个分别奇偶讨论而已。n为奇数和n为偶数时,斜着填数的次数不同。
(今天有空,详注了代码@-@)

#include 
using namespace std;
int arr[1010][1010];
int n;
void solve()//把矩形分为两个三角形(1,1)(1,n)(n,1)组成,(1,n)(n,n)(n,1)组成 
{
	arr[1][1]=1;//起点初始化 
	int tot=1;//计数器初始化 
	int x=1,y=1;//坐标初始化 
	if(n%2==0)//n为偶数 
	{
	while(tot<n*n) //先填左上角的 
	{
		arr[x][++y]=++tot;//遇到上边界向右填数 
		while(arr[x+1][y-1]==-1)	arr[++x][--y]=++tot;//判断下个点,是否在矩阵范围内并斜左下填数 
		if(tot==(((n*n)/2)+n/2)) break;//填到对角线的时候退出,找规律即可 
		arr[++x][y]=++tot;//遇到左边界向下填数 
		while(arr[x-1][y+1]==-1)	arr[--x][++y]=++tot;//斜右上填数 
	}
	while(tot<n*n)//继续补完 
	{
		arr[x][++y]=++tot;//同理可得 
		while(arr[x-1][y+1]==-1)	arr[--x][++y]=++tot;	
		arr[++x][y]=++tot;
		while(arr[x+1][y-1]==-1)	arr[++x][--y]=++tot;
	}}
	else//n为奇数,遇到对角线情况退出的位置不同,其余类似 
	{
	while(tot<n*n)
	{
		arr[x][++y]=++tot;
		while(arr[x+1][y-1]==-1)	arr[++x][--y]=++tot;
		arr[++x][y]=++tot;
		while(arr[x-1][y+1]==-1)	arr[--x][++y]=++tot;
		if(tot==((n*n)/2+n/2+1))	break; 
	}
	while(tot<n*n)
	{
		arr[++x][y]=++tot;
		while(arr[x+1][y-1]==-1)	arr[++x][--y]=++tot;
		arr[x][++y]=++tot;
		while(arr[x-1][y+1]==-1)	arr[--x][++y]=++tot;
	}	
	}
	return ;
}
int main()
{
	int i,j;
	cin>>n;
	for(i=1;i<=n;i++)//给矩阵划上范围,先让矩阵里的值都为-1 
		for(j=1;j<=n;j++)	arr[i][j]=-1;
	
	solve();
	
	for(i=1;i<=n;i++)//输出矩阵 
	{
	for(j=1;j<=n;j++)	cout<<arr[i][j]<<" ";
	cout<<endl;
	}
}

你可能感兴趣的:(c++,矩阵)