3 条题解
-
1
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int MAXN = 1e6 + 100; const int MAXM = 3e3 + 10; template < typename T > inline void read(T &x) { x = 0; T ff = 1, ch = getchar(); while(!isdigit(ch)) { if(ch == '-') ff = -1; ch = getchar(); } while(isdigit(ch)) { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } x *= ff; } template < typename T > inline void write(T x) { if(x < 0) putchar('-'), x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0'); } int T, n, m; int vis[MAXN], dis[MAXN]; int lin[MAXN], tot = 0; char ch; struct edge { int y, v, next; } e[MAXN]; inline void add(int xx, int yy, int vv) { e[++tot].y = yy; e[tot].v = vv; e[tot].next = lin[xx]; lin[xx] = tot; } void Dijkstra() { memset(dis, 0x3f, sizeof(dis)); memset(vis, false, sizeof(vis)); priority_queue < pair < int, int > > q; dis[1] = 0; q.push(make_pair(0, 1)); while(!q.empty()) { int x = q.top().second; q.pop(); if(vis[x]) continue; vis[x] = true; for(int i = lin[x], y; i; i = e[i].next) { if(dis[y = e[i].y] > dis[x] + e[i].v) { dis[y] = dis[x] + e[i].v; if(!vis[y]) q.push(make_pair(-dis[y], y)); } } } } int main() { read(T); while(T--) { read(n); read(m); memset(lin, 0, sizeof(lin)); memset(e, 0, sizeof(e)); tot = 0; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { ch = getchar(); if(ch == '/') { add(((i - 1) * (m + 1) + j), i * (m + 1) + j + 1, 1); add(i * (m + 1) + j + 1, (i - 1) * (m + 1) + j, 1); add(i * (m + 1) + j, (i - 1) * (m + 1) + j + 1, 0); add((i - 1) * (m + 1) + j + 1, i * (m + 1) + j, 0); } else { add(((i - 1) * (m + 1) + j), i * (m + 1) + j + 1, 0); add(i * (m + 1) + j + 1, (i - 1) * (m + 1) + j, 0); add(i * (m + 1) + j, (i - 1) * (m + 1) + j + 1, 1); add((i - 1) * (m + 1) + j + 1, i * (m + 1) + j, 1); } } ch = getchar(); } Dijkstra(); if(dis[(n + 1) * (m + 1)] == INF) puts("NO SOLUTION"); else write(dis[(n + 1) * (m + 1)]), puts(""); } return 0; }
信息
- ID
- 86
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 69
- 已通过
- 27
- 上传者