四、逃离大迷宫(Weekly Contest 134)

探讨使用双向BFS算法解决迷宫中从源点到目标点的路径寻找问题,对比不同实现方式,分析超时原因及优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
在这里插入图片描述

我的超时了,尽管使用了双向的bfs也是超时了
代码:

public boolean isEscapePossible(int[][] blocked, int[] source, int[] target) {
       
    	if(blocked == null || blocked.length == 0)
    	return true;
    	
//    	存放已经被封锁的
    	Set<Long> feng = new HashSet<>();
    	int mod = 1000000;
    	
    	for (int [] tem  : blocked) {
			feng.add((long) (tem[0] * mod + tem[1]));
		}
    	if(feng.contains((long)(source[0] * mod + source[1])) || feng.contains((long)(target[0] * mod + target[1]))){
    		return false;
    	}
    	int x[] = {0,0,1,-1};
    	int y[] = {1,-1,0,0};


        Set<Long> isvisit = new HashSet<>();
    	
    	Queue<int[]> queue1 = new LinkedList<>();
    	queue1.offer(new int[]{source[0],source[1]});
    	isvisit.add((long) (source[0]  * mod + source[1]));
    	
    	Set<Long> listqu1visit = new HashSet<>();
    	listqu1visit.add((long) (source[0] * mod+ source[1]));
    	
    	Queue<int[]> queue2 = new LinkedList<>();
    	queue2.offer(new int[]{target[0],target[1]});
    	
    	Set<Long> listqu2visit = new HashSet<>();
    	listqu2visit.add((long) (target[0] * mod+ target[1]));
    	
    	
    	
    	isvisit.add((long) (target[0] * mod + target[1]));
        
    	
    	while (!queue1.isEmpty() && !queue2.isEmpty()) {
			int size = queue1.size();
			int size2 = queue2.size();
			if(size < size2){
				for (int j = 0; j < size; j++) {
					int ges[] = queue1.poll();
		    		int temx = ges[0];
		    		int temy = ges[1];
		    		for (int i = 0; i < 4; i++) {
						int x1 = temx + x[i];
						int y1 = temy + y[i];
						if(listqu2visit.contains((long) (x1 * mod + y1))){
							return true;
						}
						if(x1 >= 0 && x1 < mod && y1 >= 0 && y1 < mod && !feng.contains(x1 + "" + y1) && !isvisit.contains(x1 + "" + y1)){
							queue1.offer(new int[]{x1,y1});
							listqu1visit.add((long) (x1 * mod + y1));
							isvisit.add((long) (x1 * mod + y1));
						}
					}
				}
			}else {
				for (int j = 0; j < size2; j++) {
					int []ges = queue2.poll();
		    		int temx = ges[0];
		    		int temy = ges[1];
		    		for (int i = 0; i < 4; i++) {
						int x1 = temx + x[i];
						int y1 = temy + y[i];
						if(listqu1visit.contains((long) (x1 * mod + y1))){
							return true;
						}
						if(x1 >= 0 && x1 < mod && y1 >= 0 && y1 < mod && !feng.contains(x1 + "" + y1) && !isvisit.contains(x1 + "" + y1)){
							queue2.offer(new int[]{x1,y1});
							listqu2visit.add((long) (x1 * mod + y1));
							isvisit.add((long) (x1 * mod + y1));
						}
					}
				}
	    		
			}
			
			
    		
    		
		}
    	return false;
    	
    	
        
    }

参照别人的代码:

class Solution {
    
    int dx[] = new int[]{0,0,1,-1};
    int dy[] = new int[]{1,-1,0,0};
    
    
    Set<Long> st = new HashSet<Long>();
    
    public boolean isEscapePossible(int[][] b, int[] s, int[] t) {
        
            for(int[] v:b){
                long ck = (long)v[0]*(long)1000000+(long)v[1];
                st.add(ck);
                
            }
        
        
            Queue<int[]> que = new LinkedList<>();
        
            que.offer(s);
        
            int d =1;
        
            
            while(que.size()>0){
                if(d==201){
                    return true;
                }
                int sz = que.size();
                
                for(int i=0;i<sz;++i){
                    int go[] = que.poll();
                    
                    if(go[0]==t[0]&&go[1]==t[1]) return true;
                    
                    for(int ii=0;ii<4;++ii){
                        int nx = dx[ii]+go[0];
                        int ny = dy[ii]+go[1];
                        long ck = (long)nx*(long)1000000+(long)ny;
                        if(nx>=0&&ny>=0&&nx<1000000&&ny<1000000&&!st.contains(ck)){
                            st.add(ck);
                            que.offer(new int[]{nx,ny});
                        }
                        
                        
                    }
                    
                    
                }
                
                
                
                d++;
                
                
            }
        
        
            return false;
        
        
        
        
    }
}

注意的是强制转成long必须这么写,可能我的这里强制转换出现了错误
在这里插入图片描述
如果还是不清楚的话可以参照这个详细解释添加链接描述
具体如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值