题目
题解:
按题解思路的代码:
#include <bits/stdc++.h>using i64 = long long;void solve() {int n, m;std::cin >> n >> m;std::vector a(n, std::vector<int>(m));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {std::cin >> a[i][j];}}std::queue<std::pair<int, int>> q;std::vector dis(n, std::vector(m, -1));q.emplace(0, 0);dis[0][0] = 0;while (!q.empty()) {auto [x, y] = q.front();q.pop();if (y < m - 1 && a[(x + 1) % n][y + 1] == 0 && dis[(x + 1) % n][y + 1] == -1) {dis[(x + 1) % n][y + 1] = dis[x][y] + 1;q.emplace((x + 1) % n, y + 1);}if (a[(x + 1) % n][y] == 0 && a[(x + 2) % n][y] == 0 && dis[(x + 2) % n][y] == -1) {dis[(x + 2) % n][y] = dis[x][y] + 1;q.emplace((x + 2) % n, y);}}int ans = -1;for (int i = 0; i < n; i++) {int res = dis[i][m - 1];if (res != -1) {if (res % n != (i + 1) % n) {res += (i + 1 - res % n + n) % n;}if (ans == -1 || ans > res) {ans = res;}}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}
另一种方法:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define fi first
#define se second
#define lson p << 1
#define rson p << 1 | 1
#define ll long long
#define pii pair<int, int>
#define ld long double
const int maxn = 1e6 + 5, inf = 1e18, maxm = 4e4 + 5, base = 37;
const int N = 2e6;
const int mod = 1e9 + 7;
// const int mod = 998244353;
// const __int128 mod = 212370440130137957LL;
int n, m;//long long ? maxn ? n? m?
void solve(){ll res = 0;int k;cin >> n >> m;// vector<int> a(n + 1);// for(int i = 1; i <= n; i++){// cin >> a[i];// }vector<vector<int>> a(n + 1, vector<int>(m + 1)), dis(n + 1, vector<int>(m + 1, inf));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> a[i][j];}}queue<pii> q;dis[0][0] = 0;q.push({0, 0});while(!q.empty()){auto [x, y] = q.front();q.pop();int nx = (x + 1) % n, ny = y;if(dis[nx][ny] == inf && a[(x + 1 + dis[x][y]) % n][y] == 0 && a[(x + 2 + dis[x][y]) % n][y] == 0){dis[nx][ny] = dis[x][y] + 1;q.push({nx, ny});}nx = x, ny = y + 1;if(ny < m && dis[nx][ny] == inf && a[(x + 1 + dis[x][y]) % n][y + 1] == 0){dis[nx][ny] = dis[x][y] + 1;q.push({nx, ny});}}res = inf;for(int i = 0; i < n; i++){res = min({res, dis[i][m - 1] + min(n - 1 - i, i + 1)});}if(res == inf) res = -1;cout << res << '\n';
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cout << fixed << setprecision(9);int T = 1;cin >> T;while (T--){solve();}return 0;
}