#模拟 ## 题意简介 在一个 $n\times n$ 的矩阵里面,有一个人要一行一行蛇形爬过去。求一条路径 $l$,使得 $\sum\limits_{i=1}^{n^2-1}l_i>l_{i+1}$ 严格小于 $\sum\limits_{i=1}^{n^2-1}l_{i}\le l_{i-1}$。 ## 思路 我们可以枚举每一列,蛇形记录下路径。然后对路径进行枚举,分别记录正着要爬的台阶数量以及反着要爬的台阶数量,取最小值输出路径。 ```cpp #include <algorithm> #include <iostream> #include <vector> using namespace std; const int kMaxN = 65; int a[kMaxN][kMaxN], t, n, c1, c2; vector<int> v; // 使用vector记录路径 int main() { for (cin >> t; t; t--) { cin >> n, v.clear(), c1 = c2 = 0; // 多测记得清空 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } for (int i = 1; i <= n; i++) { if (i & 1) { // 如果是奇数行 for (int j = 1; j <= n; j++) { // 正着走过去 v.push_back(a[i][j]); } } else { // 偶数行 for (int j = n; j >= 1; j--) { // 反着走过去 v.push_back(a[i][j]); } } } for (int i = 0; i < n * n - 1; i++) { // 注意vector是从零开始的 v[i] > v[i + 1] ? ++c1 : ++c2; // c1,c2分别表示反着、正着走过去的台阶数 } if (c1 < c2) { // 如果反着更优 for (int i = n * n - 1; i >= 0; i--) { // 反向输出 cout << v[i] << ' '; } } else { for (int i = 0; i < n * n; i++) { // 正着输出 cout << v[i] << ' '; } } cout << '\n'; } return 0; } ```