蛇形方阵
- 题在这👉洛谷 P5731 蛇形方阵👇
【深基5.习6】蛇形方阵
题目描述
给出一个不大于
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。
- 这是一道入门里面相对有些难的题,现在讲解一下。
- 如果直接按从左到右从上到下的顺序输出难以实现的话,不妨试一试一开始先把地图全部设为0,在按照一定顺序进行填充,最后输出。
#include<bits/stdc++.h>
using namespace std;
const int N = 101;
int arr[N][N];
int main()
{
int x = 1,y = 1,sum = 1,n;
arr[x][y] = 1;//第一个元素始终是1
cin>>n;//读入边长
while(1)//先写一个死循环,地图被填满跳出循环体
{
if(sum == n*n) break;//判断地图填满,终止循环
while(y+1 <= n && arr[x][y+1] == 0)//向右更新,判断没有出地图并且要更新的元素是0
{
y++;//右移
sum++;//总更新个数
arr[x][y] = sum;//定义第sum个数字
}
while(x+1 <= n && arr[x+1][y] == 0)//向下更新,判断没有出地图并且要更新的元素是0
{
x++;//下移
sum++;//总更新个数
arr[x][y] = sum;//定义第sum个数字
}
while(y-1 >= 1 && arr[x][y-1] == 0)//向左更新,判断没有出地图并且要更新的元素是0
{
y--;//左移
sum++;//总更新个数
arr[x][y] = sum;//定义第sum个数字
}
while(x-1 >= 1 && arr[x-1][y] == 0)//向上更新,判断没有出地图并且要更新的元素是0
{
x--;//上移
sum++;//总更新个数
arr[x][y] = sum;//定义第sum个数字
}
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
printf("%3d",arr[i][j]);//输出地图,对齐3格
}
printf("\n");
}
}
代码中,定义了四种填充方式,四步while循环自动判断,相对于for循环和定义步长变量要简单很多。
有时一时想不起来的问题,可以跳出以往的习惯代码模板,换一种思维方式,去迎合问题来处理,往往会更加简单。😎