
🎁个人主页: 工藤新一¹
🔍系列专栏: C++面向对象(类和对象篇)
🌟心中的天空之城,终会照亮我前方的路
🎉欢迎大家点赞👍评论📝收藏⭐文章
文章目录
- [P5731 【深基5.习6】蛇形方阵](#P5731 【深基5.习6】蛇形方阵)
- 算法原理
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。
算法原理
- 解法:模拟填数的过程
一、方向向量(矩阵、搜索通用解法)
方向向量常常适用于解决矩阵中填数的场景,然后根据规则结合方向向量填数



- 处理越界情况,并 使
pos
成环形移动

二、代码实现
cpp
#include<iostream>
using namespace std;
const int N = 15;
//定义方向向量 (右、下、左、上 四个方向)
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
int arr[N][N];
int main()
{
int pos = 0;//控制偏移量(当前的方向)
int n; cin >> n;
//模拟填数过程
//定义起始坐标(1,1),通过变量 cnt 进行填数操作
int x = 1, y = 1, cnt = 1;
while(cnt <= n * n)
{
//为数组增添数据
arr[x][y] = cnt;
//计算下一位置坐标(当前位置 + 对应的偏移量)
int a = x + dx[pos], b = y + dy[pos];
//进行越界处理
if(a < 1 || a > n || b < 1 || b > n || arr[a][b] != 0)
{
//更新当前应走的正确方向(并使 pos 成环形,循环)
pos = (pos + 1) % 4;
//那么重新计算正确的移动位置
a = x + dx[pos], b = y + dy[pos];
}
//更新计算好的正确位置
x = a, y = b;
cnt++;
}
//循环输出...
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
printf("%3d", arr[i][j]);
}
puts("");//换行
}
return 0;
}


🌟 各位看官好 ,我是工藤新一¹呀~
🌈 愿各位心中所想,终有所致!