P1510 - [蓝桥杯2020初赛] 蛇形填数 - New Online Judge (ecustacm.cn)
这个题的主要思路就是找规律,可以观察到各个行上的数满足的规律如下所示。
(1, 1) (1, 2) (2, 1) (3, 1) (2, 2) (1, 3) (1, 4) (2, 3) (3, 2) (4, 1)
由此我们可以分奇数和偶数来讨论。不难发现,这个数的规律是斜着的。所以我们就分奇数和偶数,斜着观察这个图。规律就很明显了。代码中有具体的规律。具体就是在第几个斜的上面,我们先判断是奇数还是偶数,偶数就是从 第一个数从 1 开始到第二个数成为1, 奇数正好相反。
上代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int N = 1e3 + 10;
int g[N][N];
void solve()
{
int cnt = 1;
for (int i = 1; i <= 100; i ++)
{
if (i & 1)
{
for (int j = i, k = 1; j >= 1; j --, k ++)
{
g[j][k] = cnt ++;
}
}
else
{
for (int j = i, k = 1; j >= 1; j --, k ++)
{
g[k][j] = cnt ++;
}
}
}
for (int i = 1; i <= 100; i ++)
{
for (int j = 1; j <= 100; j ++)
{
if (g[i][j])
cout << g[i][j] << " ";
}
cout << "\n";
}
}
/*
*/
signed main()
{
solve();
return 0;
}