1 条题解
-
0
思路与算法
按东南西北的方向编码逐次尝试前进;越界或障碍只右转不移动,用位置布尔数组统计曾到达的不同格子。
正确性说明
每步由当前状态唯一决定,直接按两个分支更新与题面一致。起始格先标记,此后只在进入此前未到达格时加1,因此访问统计无重无漏。
复杂度
每组O(nm+k)时间、O(nm)空间,含地图输入与访问数组清零;T组串行。
易错点
转向本身消耗一次操作;方向0是东,和其他巡检题的北起编码不同。起点也计入。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n, m, k, x, y, d; cin >> n >> m >> k >> x >> y >> d; --x; --y; vector<string> g(n); for (auto &s : g) cin >> s; vector<unsigned char> seen(n * m); seen[x * m + y] = 1; int ans = 1, dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; while (k--) { int a = x + dx[d], b = y + dy[d]; if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == 'x') d = (d + 1) % 4; else { x = a; y = b; if (!seen[x * m + y]) { seen[x * m + y] = 1; ans++; } } } cout << ans << "\n"; } }
- 1