zoukankan      html  css  js  c++  java
  • JZOJ 5781

    这题就一 bfs ,没啥好说的

    重点:bfs 更新顺序千万不能乱,千万不能乱


    代码:

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cctype>
    #include<cstdio>
    #include<queue>
    using namespace std;
    
    const int MAXN = 505;
    
    int n, m, ans;
    int dst[MAXN][MAXN], wall[MAXN][MAXN][4];
    pair<int, int> s, t;
    char mp[MAXN][MAXN];
    
    inline int rd() {
    	register int x = 0;
    	register char c = getchar();
    	register bool f = false;
    	while(!isdigit(c)) {
    		f = (c == '-');
    		c = getchar();
    	}
    	while(isdigit(c)) {
    		x = x * 10 + (c ^ 48);
    		c = getchar();
    	}
    	return f ? -x : x;
    }
    inline char getc() {
    	register char c = getchar();
    	while(c != '.' && c != '#' && !isupper(c)) c = getchar();
    	return c;
    }
    inline void bfs() {
    	memset(dst, 0x3f, sizeof(dst));
    	queue<pair<int, int> > q;
    	q.push(s);
    	dst[s.first][s.second] = 0;
    	while(!q.empty()) {
    		pair<int, int> x = q.front(); q.pop();
    		int curdst = dst[x.first][x.second];
    		pair<int, int> mindst = make_pair(0x3f3f3f3f, 0);
    		if(wall[x.first][x.second][0] < mindst.first) {mindst.first = wall[x.first][x.second][0];mindst.second = 0;}
    		if(wall[x.first][x.second][1] < mindst.first) {mindst.first = wall[x.first][x.second][1];mindst.second = 1;}
    		if(wall[x.first][x.second][2] < mindst.first) {mindst.first = wall[x.first][x.second][2];mindst.second = 2;}
    		if(wall[x.first][x.second][3] < mindst.first) {mindst.first = wall[x.first][x.second][3];mindst.second = 3;}
    		if(dst[x.first - wall[x.first][x.second][0]][x.second] > curdst + mindst.first + 1) {
    			dst[x.first - wall[x.first][x.second][0]][x.second] = curdst + mindst.first + 1;
    			q.push(make_pair(x.first - wall[x.first][x.second][0], x.second));
    		}
    		if(dst[x.first][x.second + wall[x.first][x.second][1]] > curdst + mindst.first + 1) {
    			dst[x.first][x.second + wall[x.first][x.second][1]] = curdst + mindst.first + 1;
    			q.push(make_pair(x.first, x.second + wall[x.first][x.second][1]));
    		}
    		if(dst[x.first + wall[x.first][x.second][2]][x.second] > curdst + mindst.first + 1) {
    			dst[x.first + wall[x.first][x.second][2]][x.second] = curdst + mindst.first + 1;
    			q.push(make_pair(x.first + wall[x.first][x.second][2], x.second));
    		}
    		if(dst[x.first][x.second - wall[x.first][x.second][3]] > curdst + mindst.first + 1) {
    			dst[x.first][x.second - wall[x.first][x.second][3]] = curdst + mindst.first + 1;
    			q.push(make_pair(x.first, x.second - wall[x.first][x.second][3]));
    		}
    		if(mp[x.first + 1][x.second] != '#') {
    			if(dst[x.first + 1][x.second] > curdst + 1) {
    				dst[x.first + 1][x.second] = curdst + 1;
    				q.push(make_pair(x.first + 1, x.second));
    			}
    		}
    		if(mp[x.first][x.second + 1] != '#') {
    			if(dst[x.first][x.second + 1] > curdst + 1) {
    				dst[x.first][x.second + 1] = curdst + 1;
    				q.push(make_pair(x.first, x.second + 1));
    			}
    		}
    		if(mp[x.first - 1][x.second] != '#') {
    			if(dst[x.first - 1][x.second] > curdst + 1) {
    				dst[x.first - 1][x.second] = curdst + 1;
    				q.push(make_pair(x.first - 1, x.second));
    			}
    		}
    		if(mp[x.first][x.second - 1] != '#') {
    			if(dst[x.first][x.second - 1] > curdst + 1) {
    				dst[x.first][x.second - 1] = curdst + 1;
    				q.push(make_pair(x.first, x.second - 1));
    			}
    		}
    	}
    	ans = dst[t.first][t.second];
    	return;
    }
    inline void scan() {
    	int cur = n, dist[MAXN] = {0};
    	while(cur) {
    		for(int i = 1; i <= m; ++i) {
    			if(mp[cur][i] == '#') {
    				wall[cur][i][2] = -1;
    				dist[i] = 0;
    			} else {
    				wall[cur][i][2] = dist[i];
    				++dist[i];
    			}
    		}
    		--cur;
    	}
    	cur = 1; for(int i = 1; i <= m; ++i) dist[i] = 0;
    	while(cur <= n) {
    		for(int i = 1; i <= m; ++i) {
    			if(mp[cur][i] == '#') {
    				wall[cur][i][0] = -1;
    				dist[i] = 0;
    			} else {
    				wall[cur][i][0] = dist[i];
    				++dist[i];
    			}
    		}
    		++cur;
    	}
    	cur = 1; for(int i = 1; i <= m; ++i) dist[i] = 0;
    	while(cur <= m) {
    		for(int i = 1; i <= n; ++i) {
    			if(mp[i][cur] == '#') {
    				wall[i][cur][3] = -1;
    				dist[i] = 0;
    			} else {
    				wall[i][cur][3] = dist[i];
    				++dist[i];
    			}
    		}
    		++cur;
    	}
    	cur = m; for(int i = 1; i <= n; ++i) dist[i] = 0;
    	while(cur) {
    		for(int i = 1; i <= n; ++i) {
    			if(mp[i][cur] == '#') {
    				wall[i][cur][1] = -1;
    				dist[i] = 0;
    			} else {
    				wall[i][cur][1] = dist[i];
    				++dist[i];
    			}
    		}
    		--cur;
    	}
    	return;
    }
    
    int main() {
    	freopen("portal.in", "r", stdin);
    	freopen("portal.out", "w", stdout);
    	n = rd(); m = rd();
    	for(int i = 1; i <= n; ++i) {
    		for(int j = 1; j <= m; ++j) {
    			mp[i][j] = getc();
    			if(mp[i][j] == 'C') s = make_pair(i, j);
    			else if(mp[i][j] == 'F') t = make_pair(i, j);
    		}
    	}
    	scan();
    	bfs();
    	if(ans == 0x3f3f3f3f) puts("nemoguce");
    	else printf("%d
    ", ans);
    	return 0;
    }
    

      

    禁止诸如开发者知识库/布布扣/码迷/学步园/马开东等 copy 他人博文乃至博客的网站转载 ,用户转载请注明出处:https://www.cnblogs.com/xcysblog/
  • 相关阅读:
    Longhorn,企业级云原生容器分布式存储
    Longhorn,企业级云原生容器分布式存储
    Longhorn,企业级云原生容器分布式存储
    数通——VLAN
    数通——动态路由
    AtCoder Beginner Contest 216 A~F 题解
    【YBTOJ】序列的第k个数
    【YBTOJ】【UVA10140】Prime Distance
    【YBTOJ】【CodeForces 372C】Watching Fireworks is Fun
    【YBTOJ】涂抹果酱
  • 原文地址:https://www.cnblogs.com/xcysblog/p/9446028.html
Copyright © 2011-2022 走看看