目录
题目 - 蛇形方阵
题目描述
给出一个不大于 9 的正整数 n,输出 n × n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
输入格式
输入一个正整数 n,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例
样例输入 #1
4
样例输出 #1
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
提示
数据保证,1 ≤ n ≤ 9。
AC CODE
思路
-
数据的增长方向一共有 4 个,左上 → 右上,右上 → 右下,右下 → 左下,左下 → 左上
-
设置一个标志位 flag_run 来确定当前的数据增长方向,每切换一次增长方向,使标志位自增一次
-
得到数学关系:flag_run / 4 得到的值为 当前下标在矩阵由外到内的第几轮
一个完整 左上 → 右上,右上 → 右下,右下 → 左下,左下 → 左上 过程为一轮
-
得到数学关系:flag_run % 4 得到的值分别对应以上四个方向
-
设置两个下标位【read_x,read_y】来标记当前的数组下标
则四个方向对应的下标变化为y++,x++,y--,x--
AC CODE
#include <iostream>
using namespace std;
int main()
{
int n; // 矩阵大小输入
cin >> n;
int ans_arr[10][10]; // 结果数组
int read_x = 1, read_y = 1; // 标记数组下标
int flag_run = 1; // 标记增长方向
int num = 1; // 待填入的数据
while (num <= (n * n)) // 当数据还没填完(数据最大为n*n)
{
ans_arr[read_x][read_y] = num; // 将数据填入数组
int temp = flag_run % 4; // 获得当前数据增长的方向
if (temp == 1) // 左上 → 右上
{
read_y++; // 列坐标++
if (read_y == (n - (flag_run / 4))) // 增长到这一轮的最后一列
{
flag_run++; // 改变增长方向
}
}
else if (temp == 2) // 右上 → 右下
{
read_x++; // 行坐标++
if (read_x == (n - (flag_run / 4))) // 增长到这一轮的最后一行
{
flag_run++; // 改变增长方向
}
}
else if (temp == 3) // 右下 → 左下
{
read_y--; // 列坐标--
if (read_y == (1 + (flag_run / 4))) // 减小到这一轮的第一列
{
flag_run++; // 改变增长方向
}
}
else // 左下 → 左上
{
read_x--; // 行坐标--
if (read_x == (1 + (flag_run / 4))) // 减小到这一轮的第一行
{
flag_run++; // 改变增长方向
}
}
num++; // 待填入数据自增
}
for (int h = 1; h <= n; h++) // 输出处理
{
for (int i = 1; i <= n; i++)
{
printf("%3d", ans_arr[h][i]);
}
cout << endl;
}
return 0;
}
标签:CODE,下标,P5731,int,样例,read,蛇形,洛谷
From: https://www.cnblogs.com/Muhuai/p/18367792