分析:模拟每一层时,设置左右边界,避免重复耗时计算
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; char map[110][10010]; long long ans; int main() { int m, n, i, j, p = 1, l, r, t = 0; scanf("%d%d", &m, &n); for (i = 0; i < m; ++i) { scanf("%s", map[i] + 1); map[i][0] = map[i][n + 1] = '#'; } for (i = 0; i < m - 1; ++i) { //printf("i=%d p=%d\n",i,p); // cout<<ans<<endl; if (map[i + 1][p] == '.') { ++ans; continue; } l = p - 1; r = p + 1; while (1) { // cout<<ans<<endl; //printf("l=%d r=%d\n",l,r); if (map[i][l] == '#' && map[i][r] == '#') { printf("Never\n"); return 0; } ans += r - l - 2; if (!t) { //printf("right\n"); while (map[i][r] == '.' && map[i + 1][r] != '.') { ++r; ++ans; } if (map[i][r] == '.') { ans += 2; p = r; break; } if (map[i][r] == '+') { t = !t; ++ans; map[i][r] = '.'; } else if (map[i][r] == '#') { t = !t; ++ans; } } else { //printf("left\n"); while (map[i][l] == '.' && map[i + 1][l] != '.') { --l; ++ans; } if (map[i][l] == '.') { ans += 2; p = l; break; } if (map[i][l] == '+') { t = !t; ++ans; map[i][l] = '.'; } else if (map[i][l] == '#') { t = !t; ++ans; } } } } cout << ans << endl; return 0; }