寻找规律,迎刃而解
可以发现每一斜行的数字个数是由1递增至n再递减至1的,写每一斜行的数字递增方向都是固定的。
需要注意:1.对角线的左右两侧切换斜行时坐标变化不同
2.n为奇数和偶数时要做细节的处理
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int arr[1010][1010];
memset(arr, 0, sizeof arr);
int x = 2, y = 0;
int dir_x = -1, dir_y = 1;
int cnt = 0;
//对角线左上侧
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
x += dir_x;
y += dir_y;
arr[x][y] = ++cnt;
}
if (dir_x == 1)
{
x += 2;
y -= 1;
}
else
{
x -= 1;
y += 2;
}
dir_x = -dir_x;
dir_y = -dir_y;
}
//对角线右下侧
//先做一个预处理
if (n % 2 == 0)
{
x -= 1;
y += 1;
}
else
{
x += 1;
y -= 1;
}
for (int i = n - 1; i >= 1; i--)
{
for (int j = 1; j <= i; j++)
{
x += dir_x;
y += dir_y;
arr[x][y] = ++cnt;
}
if (dir_x == 1)
{
x += 1;
}
else
{
y += 1;
}
dir_x = -dir_x;
dir_y = -dir_y;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < n; j++)
cout << arr[i][j] << " ";
cout << arr[i][n] << endl;
}
}
京公网安备 11010502036488号