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/
  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/xcysblog/p/9446028.html
Copyright © 2011-2022 走看看