2396: 【入门】【P5731】蛇形方阵

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:29 解决:11

题目描述

给出一个不大于 lns="http://www.w3.org/1998/Math/MathML">9 的正整数 lns="http://www.w3.org/1998/Math/MathML">,输出 lns="http://www.w3.org/1998/Math/MathML">× 的蛇形方阵。

从左上角填上 lns="http://www.w3.org/1998/Math/MathML">1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 lns="http://www.w3.org/1998/Math/MathML">3 个字符,前面使用空格补齐。

输入

输入一个正整数 lns="http://www.w3.org/1998/Math/MathML">,含义如题所述。

输出

输出符合题目要求的蛇形矩阵。

样例输入 复制

4

样例输出 复制

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

提示

数据保证,lns="http://www.w3.org/1998/Math/MathML">19


#include<cstdio>
using namespace std;
int a[20][20];
int main(){
	int n,k=1,x=1,y=0;
	scanf("%d",&n);
	while (k<=n*n)
	{   
	    /*
	    每一轮循环都按照:右->下->左->上的顺序填数字;
	    向右填数:
	    如果当前位置的右边没有超出边界(y<n)
	    而且还没有填数字(!a[x][y+1]),
	    则在右边(a[x][++y])的位置填写数字k,然后当前位置右移1格,
	    并让k自增1(k++)。
	    其它方向同理。
	    */
		while(y<n&&!a[x][y+1])a[x][++y]=k++;
		while(x<n&&!a[x+1][y])a[++x][y]=k++;
		while(y>1&&!a[x][y-1])a[x][--y]=k++;
		while(x>1&&!a[x-1][y])a[--x][y]=k++;
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)printf("%3d",a[i][j]);
		printf("\n");	
	}		
	return 0;
}