3 条题解

  • 1
    @ 2025-11-30 8:52:42
    #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
    上传者