• 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/
  • 相关阅读:
    IO复用三种方式
    sql server如何通过pivot对数据进行行列转换(进阶)
    sql server排序规则冲突问题解决
    sql server如何通过pivot对数据进行行列转换
    sql server如何通过排序控制insert into ... select ... 语句的记录插入顺序
    sql server如何用不同语种语言显示报错的错误消息
    Python编程求解第1天1分钱之后每天两倍持续一个月的等比数列问题
    sql server临时删除/禁用非聚集索引并重新创建加回/启用的简便编程方法研究对比
    sql server通过临时存储过程实现使用参数添加文件组脚本复用
    sql server重建全库索引和更新全库统计信息通用脚本
  • 原文地址:https://www.cnblogs.com/xcysblog/p/9446028.html
Copyright © 2020-2023  润新知