关于迷宫的一些问题(简单DFS的应用)

计蒜客迷宫求解,求出迷宫最短步数,点击此处链接

import java.util.Scanner;
public class Main {
	
    public static int n,m,p,q,r,s;
    public static int min=50000000;
    public static int [][]dis= {{0,1},{1,0},{0,-1},{-1,0}};
    public static char [][]map=new char[100][100];
    public static int [][]vis=new int [100][100];
    public static boolean flag=false;
    public static String []Map=new String [100];
	
	public static void main(String[] args) {
     Scanner scanner=new Scanner(System.in);
     n=scanner.nextInt();
     m=scanner.nextInt();
     
    for(int i=0;i<n;i++)
     {
    	Map[i]=scanner.next();
     }
    
    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<m;j++)
    	{
    		
    		
    		if (Map[i].charAt(j)=='@')//找到起点
    		{
    			p=i;
    			q=j;
    			
    		}
    		
    	}
    }
    
     dfs(p, q,0);
      if (flag==true)
    	  System.out.println(min);
      else
      {
		 System.out.println("-1");
	  }
	}
	public static void dfs(int x,int y,int step)
	{
		int xn,yn,i;
		if (x==0||x==n-1||y==0||y==m-1)//到达边界后就出来了分别为四条边
		{
		flag=true;
		min=Math.min(min, step);
		return ;
		}
		
		for(i=0;i<4;i++)
		{
			xn=dis[i][0]+x;
			yn=dis[i][1]+y;
			if(xn>=0&&xn<n&&yn>=0&&yn<m&&vis[xn][yn]==0&&Map[xn].charAt(yn)!='#')
			{
			    vis[xn][yn]=1;
				dfs(xn, yn,step+1);
				vis[xn][yn]=0;
			}
		}
	}

}

[计蒜客迷宫求解,是否可以出迷宫,点击此处链接](https://nanti.jisuanke.com/t/T1595)


import java.util.Scanner;

public class Main {
	//起点到终点的最短路径
    public static int n,m,p,q,r,s;
    public static int min=50000000;
    public static int [][]dis= {{0,1},{1,0},{0,-1},{-1,0}};
    public static char [][]map=new char[100][100];
    public static int [][]vis=new int [100][100];
    public static boolean flag=false;
    public static String []Map=new String [100];
	
	public static void main(String[] args) {
     Scanner scanner=new Scanner(System.in);
     n=scanner.nextInt();
     m=scanner.nextInt();
     
    for(int i=0;i<n;i++)
     {
    	Map[i]=scanner.next();
     }
    
    for(int i=0;i<n;i++)
    {
    	for(int j=0;j<m;j++)
    	{
    		
    		
    		if (Map[i].charAt(j)=='S')
    		{
    			p=i;
    			q=j;
    			break;
    		}
    	}
    }
    
     dfs(p, q);
      if (flag==true)
    	  System.out.println("yes");
      else
      {
		 System.out.println("no");
	  }
	}
	public static void dfs(int x,int y)
	{
		int xn,yn,i;
		if (Map[x].charAt(y)=='T')
		{
		flag=true;
		return ;
		}
		
		for(i=0;i<4;i++)
		{
			xn=dis[i][0]+x;
			yn=dis[i][1]+y;
			if(xn>=0&&xn<n&&yn>=0&&yn<m&&vis[xn][yn]==0&&Map[xn].charAt(yn)!='*')
			{
			    vis[xn][yn]=1;
				dfs(xn, yn);
				vis[xn][yn]=0;
			}
		}
	}

}













计蒜客求解迷宫的最短步数BFS,点击链接

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class BFS {
    public static Queue<Node> Q=new LinkedList<Node>();
    public static String [] map=new String[100];
    public static int [] []vis=new int [100][100];
    public static int n,m,min=999999,p,q,flag=0;
    public static int [][]dis=new int[][] {{0,1},{1,0},{0,-1},{-1,0}};
	@SuppressWarnings("resource")
	public static void main(String[] args) {
	Scanner scanner=new Scanner(System.in);
	    n=scanner.nextInt();
        m=scanner.nextInt();
        for(int i=0;i<n;i++)
        map[i]=scanner.next();
        for(int i=0;i<n;i++)
        {
        	for(int j=0;j<m;j++)
        	{
        		if (map[i].charAt(j)=='S')
        		{
        			p=i;
        			q=j;
        			break;
        		}
        	}
        }
	    Node node=new Node();
	    node.x=p;
	    node.y=q;
	    node.step=0;
	    Q.offer(node);
	    while(!Q.isEmpty())
	    {
	    	Node s=Q.peek();
	    	if(map[s.x].charAt(s.y)=='T')
	    	{
	    		flag=1;
	    		min=Math.min(min, s.step);
	    	}
	    	else 
	    	{
			   for(int i=0;i<4;i++)
			   {
				   Node temp=new Node();
				   temp.x=s.x+dis[i][0];
				   temp.y=s.y+dis[i][1];
				   if (temp.x>=0&&temp.x<n&&temp.y>=0&&temp.y<m&&vis[temp.x][temp.y]==0&&
						   map[temp.x].charAt(temp.y)!='*')
				   {
					   
					   vis[temp.x][temp.y]=1;
					   temp.step=s.step+1;
					   Q.offer(temp);
				   }
			   }
			}
	    	Q.poll();
	    }
	    if (flag==1)
	    	System.out.println(min);
	    else
	    	System.out.println("-1");
	}

}
  class Node{
	int x;
	int y;
	int step;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值