• Java版的广度优先寻路(BFS+并查集思想)


    import java.util.Deque;
    import java.util.LinkedList;
    
    
    class node{
        int x;
        int y;
    }
    
    class Solution{
        private int dir[][]=new int[][] {{0,-1},{-1,0},{0,1},{1,0}};
        private node parentx[][];
        private int Count[][];
        private boolean used[][];
        private node start=new node();
        private node end=new node();
        private Deque<node> queue=new LinkedList<node>();
        private node temp;
        private boolean flag=false;
        public boolean isCheckMove(String[] map,node start) {
            return start.x>=0&&start.x<map.length&&start.y>=0&&start.y<map[start.x].length();
        }
        public boolean printPath(String[] map) {
            while(parentx[temp.x][temp.y].x!=temp.x||parentx[temp.x][temp.y].y!=temp.y) {
                System.out.print(map[temp.x].charAt(temp.y)+"->");
                temp=parentx[temp.x][temp.y];         
            }
            System.out.println(map[temp.x].charAt(temp.y));
            return true;
        }
        public int dfs(String[] map,node start) {
            
            queue.offer(start);
            used[start.x][start.y]=true;
            Count[start.x][start.y]=1;
            
            while(!queue.isEmpty()) {
                start=queue.pop();
                for(int i=0;i<4;++i) {
                    temp=new node();
                    temp.x=start.x+dir[i][0];
                    temp.y=start.y+dir[i][1];
                     if(temp.x==end.x&&temp.y==end.y) {
                         flag=true;
                         queue.addLast(temp);
                         parentx[temp.x][temp.y]=start;
                         Count[temp.x][temp.y]=Count[start.x][start.y]+1;
                         used[temp.x][temp.y]=true;
                        break;
                    }
                    if(isCheckMove(map,temp)&&!used[temp.x][temp.y]) {
                         queue.addLast(temp);
                         parentx[temp.x][temp.y]=start;
                         Count[temp.x][temp.y]=Count[start.x][start.y]+1;
                         used[temp.x][temp.y]=true;
                    }
                }
                if(flag) {
                    break;
                }
            }
            return Count[temp.x][temp.y];
        }
        
        public boolean nums(String map[]) {
            queue.clear();
            parentx=new node[map.length][map[0].length()];
            Count=new int[map.length][map[0].length()];
            used=new boolean[map.length][map[0].length()];
            for(int i=0;i<map.length;++i) {
                for(int j=0;j<map[i].length();++j) {
                    used[i][j]=false;
                    Count[i][j]=0;
                    node tmp=new node();
                    tmp.x=i;
                    tmp.y=j;
                    parentx[i][j]=tmp;
                    if(map[i].charAt(j)=='#') {
                        end.x=i;
                        end.y=j;
                    }
                    if(map[i].charAt(j)=='@') {
                        start.x=i;
                        start.y=j;
                    }
                }
            }
            System.out.println(dfs(map,start));
            printPath(map);
            return true;
        }
    }
    
    
    public class First{
         public static void main(String[] args) {
          Solution space = new Solution();
          String map[]= {"****","@***","&&&&","&&&&","&#**"};
          space.nums(map);
          for(String str:map) {
                System.out.println(str);
            }
        }
    }
  • 相关阅读:
    如何在调试PHP代码时不显示错误信息
    如何实现网页组件的随意拖拽
    如何做一个简易的HTML代码编辑器
    如何在网页中动态显示时间
    Luogu2577 | [ZJOI2005]午餐 (贪心+DP)
    Luogu2345 | 奶牛集会 (树状数组)
    解决NahimicSvc32.exe与bilibili直播姬的音频不兼容的问题
    STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法
    电子取证 | 第三届美亚杯(2017)个人赛题解
    快速安装字体.bat批处理脚本
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11620972.html
Copyright © 2020-2023  润新知