Java P1825 Corn Maze S

题目链接
这个题吧,真是气死我了,我以后是普遍的bfs题目,唯独有一个传送。我还是像四个方向搜索,搜一个就标记为已走过。传送也是这样,通过一个传送就把两个传送地标记为已走过。
这样才得了31分,我一直没有找到问题所在。直到看到了一篇题解中的一个例子才恍然大务。
Java P1825 Corn Maze S_第1张图片
我才明白传送装置还可以走两次,我就不标记传送了,就AC了
下面是ac代码

import java.util.*;
import java.math.*;
public class Main {
     
	public static int res=0,n,m,sx,sy,ex,ey;
	public static char[][] map;
	public static int[][] song=new int[26][4];
	public static int[] dx={
     1,-1,0,0},dy={
     0,0,-1,1};
    public static void main(String[] args){
     
    	Scanner sc=new Scanner(System.in);
    	n=sc.nextInt();
    	m=sc.nextInt();
    	sc.nextLine();   
    	map=new char[n][m];
    	for(int i=0;i<n;i++){
     
    		String s=sc.nextLine();
    		map[i]=s.toCharArray();
    		for(int j=0;j<m;j++){
     
    			if(map[i][j]=='='){
     
    				ex=i;
    			    ey=j;
    			}
    			else if(map[i][j]=='@'){
     	
    				sx=i;
    				sy=j;
    			}
    			else if(map[i][j]!='#'&&map[i][j]!='.'){
     
    				if(song[map[i][j]-'A'][0]==0){
     
    					song[map[i][j]-'A'][0]=i;
    					song[map[i][j]-'A'][1]=j;
    				}
    				else{
     
    					song[map[i][j]-'A'][2]=i;
    					song[map[i][j]-'A'][3]=j;
    				}
    			}
    		}
    	}
    	System.out.println(bfs());
    }
    public static int bfs(){
     
    	Queue<int[]> q=new LinkedList<int[]>();
    	q.offer(new int[]{
     sx,sy});
    	map[sx][sy]='#';
    	int res=0;
    	while(!q.isEmpty()){
     
    		
    		int size=q.size();
    		for(int i=0;i<size;i++){
     
    			int[] cur=q.poll();
    		    int x=cur[0];
    		    int y=cur[1];
    		    if(x==ex&&y==ey){
     
    		    	return res;
    		    }
    		    for(int j=0;j<4;j++){
     
    		    	int nx=x+dx[j];
    		    	int ny=y+dy[j];
    		    	if(nx<0||ny<0||nx==n||ny==m||map[nx][ny]=='#')
    		    		continue;
    		    	if(map[nx][ny]>='A'&&map[nx][ny]<='Z'){
     
    		    		if(song[map[nx][ny]-'A'][0]==nx&&song[map[nx][ny]-'A'][1]==ny){
     
    		    			q.offer(new int[]{
     song[map[nx][ny]-'A'][2],song[map[nx][ny]-'A'][3]});
    		    		}
    		    		else
    		    			q.offer(new int[]{
     song[map[nx][ny]-'A'][0],song[map[nx][ny]-'A'][1]});
 
    		    	}else{
     
    		    		map[nx][ny]='#';
    		    		q.offer(new int[]{
     nx,ny});
    		    	}
    		    }
    		}
    		res++;
    	}
    	return res;
    }
 }

你可能感兴趣的:(洛谷,java,bfs,dfs,java)