1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| #include <iostream> #include <queue> #include <cstring> #define endl '\n' #define x first #define y second #define int long long #pragma GCC optimize(3,"Ofast","inline") #define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0) using namespace std; const int N = 1000; using PII = pair<int,int>; int n,m; string g[N]; PII r[N]; string Move = "LRUD"; bool st[N][N];
struct Coord { int x,y; int cnt; inline Coord(int _x,int _y,int _cnt):x(_x),y(_y),cnt(_cnt){} inline bool operator<(const Coord&t)const { return cnt > t.cnt; } };
inline bool isRun(Coord& next) { int x = next.x,y = next.y; return (x >= 0 && x < n && y >= 0 && y < m && !st[x][y]); }
inline Coord operator+(Coord&a,PII&b) { return Coord(a.x + b.x,a.y + b.y,a.cnt); } inline int BFS() { priority_queue<Coord>q; q.emplace(Coord(0,0,0)); while(q.size()) { Coord now = q.top(); q.pop(); st[now.x][now.y] = true; if(now.x == n - 1 && now.y == m - 1) { return now.cnt; } for(int i = 0;i < 4;++i) { char op = Move[i]; Coord next = now + r[op]; if(isRun(next)) { if(g[now.x][now.y] == op) q.emplace(Coord(next.x,next.y,next.cnt)); else q.emplace(Coord(next.x,next.y,next.cnt + 1)); } } } return -1; } inline void solve() { memset(st,false,sizeof st); cin >> n >> m; for(int i = 0;i < n;++i) { cin >> g[i]; } cout << BFS() << endl; } signed main() {
r['L'] = PII(0,-1); r['R'] = PII(0,1); r['U'] = PII(-1,0); r['D'] = PII(1,0); IOS; int _t = 1; cin >> _t; while (_t--) { solve(); } return 0; }
|