蛇形方阵
题目描述
给出一个不大于
9
9
9 的正整数
n
n
n,输出
n
×
n
n\times n
n×n
的蛇形方阵。
从左上角填上 1 1 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 3 3 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n n n,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例 #1
样例输入 #1
4
样例输出 #1
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
提示
数据保证, 1 ≤ n ≤ 9 1 \leq n \leq 9 1≤n≤9。
解题思路key
1.已知方针向右、向下、向左、向上为一个循环周期,可用4个while语句分别判断某一方向何时终止。
2.某一方向的终止情况就两个:其一,该方向到头了;其二,“撞到了别的数”。
while(++j <= n && a[i][j] == 0)//向右
a[i][j] = t++;
j--;
while(++i <= n && a[i][j] == 0)//向下
a[i][j] = t++;
i--;
while(--j >= 1 && a[i][j] == 0)//向左
a[i][j] = t++;
j++;
while(--i >= 1 && a[i][j] == 0)//向上
a[i][j] = t++;
i++;
完整代码
#include <bits/stdc++.h>
using namespace std;
int a[10][10];
int main()
{
int n,i,j,t;
cin >> n;
a[1][1] = 1;
//一直往一个方向填:除非到头||撞到了别的数
for(i = 1,j=1,t=2; t<=n*n;)
{
//自加自减运算符放在前面,便于提前判断
//一直重复 →
// ↑ ↓
// ← 到n*n
while(++j <= n && a[i][j] == 0)//向右
a[i][j] = t++;
j--;
while(++i <= n && a[i][j] == 0)//向下
a[i][j] = t++;
i--;
while(--j >= 1 && a[i][j] == 0)//向左
a[i][j] = t++;
j++;
while(--i >= 1 && a[i][j] == 0)//向上
a[i][j] = t++;
i++;
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
cout << setw(3) <<a[i][j];
cout <<endl;
}
return 0;
}