• POJ 2251


    思路还是很清晰的,就是三维空间中运用BFS的方法,中间不幸WA过两次,问题出在这里:因为想要将dungeon的周边铺满'#',这样做的好处就是判断移动的下一步是不是还在dungeon内,可以不用一组较为耗时的不等式,不过隐患在于三维空间中,一定要记住不重不漏的填补'#',此外,填充的顺序也至关重要,这道题之前提交错误就错在其他地方都已经封装好,可惜忘记封顶,这样有可能导致直接就跳出去并被之前的测试数据所影响。

    其实一开始应该在每个循环初始化的时候全局填充为'#',这样省事,而且时间复杂度也不是多高
    总之,边界条件一定要非常的慎重,考虑周到是训练的重要内容

    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <stack>
    #include <map>
    #include <set>
    using namespace std;
    
    const int maxs= 35;
    
    struct Node
    {
    	int i, j, k;
    	Node(int _i= 0 ,int _j= 0, int _k= 0) : i(_i), j(_j), k(_k) {}
    };
    int step[6][3]= {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
    char du[maxs][maxs][maxs];
    int l, r, c;
    int si, sj, sk;
    bool vis[maxs][maxs][maxs];
    int dis[maxs][maxs][maxs];
    
    int BFS()
    {
    	queue<Node> Q;
    	memset(vis, 0, sizeof(vis));
    	vis[si][sj][sk]= 1;
    	dis[si][sj][sk]= 0;
    	Q.push(Node(si, sj, sk));
    	Node cur;
    	int i, j, k, v;
    
    	while (!Q.empty()){
    		cur= Q.front();
    		Q.pop();
    		i= cur.i;
    		j= cur.j;
    		k= cur.k;
    		v= dis[i][j][k]+1;
    
    		for (int p= 0; p< 6; ++p){
    			int ni= i+step[p][0], nj= j+step[p][1], nk= k+step[p][2];
    			if ('E'== du[ni][nj][nk]){
    				return v;
    			}
    			if ('.'== du[ni][nj][nk] && !vis[ni][nj][nk]){
    				vis[ni][nj][nk]= 1;
    				dis[ni][nj][nk]= v;
    				Q.push(Node(ni, nj, nk));
    			}
    		}
    	}
    
    	return -1;
    }
    
    int main(int argc, char const *argv[])
    {
    	memset(du[0], '#', sizeof(du[0]));
    	while (~scanf("%d %d %d", &l, &r, &c) && l){
    		for (int i= 1; i<= l; ++i){
    			memset(du[i][0], '#', sizeof(du[i][0]));
    			memset(du[i][r+1], '#', sizeof(du[i][r+1]));
    			for (int j= 1; j<= r; ++j){
    				scanf(" %s", du[i][j]+1);
    				for (int k= 1; k<= c; ++k){
    					if ('S'== du[i][j][k]){
    						si= i;
    						sj= j;
    						sk= k;
    						break;
    					}
    				}
    				du[i][j][0]= du[i][j][c+1]= '#';
    			}
    		}
    		memset(du[l+1], '#', sizeof(du[l+1]));
    		int ans= BFS();
    		if (-1== ans){
    			printf("Trapped!
    ");
    		}
    		else{
    			printf("Escaped in %d minute(s).
    ", ans);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    UVA401
    CodeForces 1330A
    CodeForces 1328C
    FZU 1759
    LightOJ 1259
    LightOJ 1341
    SDUT3930
    java入门 学习日志九(面向对象七)
    html 制作简单网页
    java入门 学习日志八(面向对象六)
  • 原文地址:https://www.cnblogs.com/Idi0t-N3/p/14687391.html
Copyright © 2020-2023  润新知