深搜算法(是否能喝到星巴克)

图片说明

import java.util.*;
import java.math.*;
public class Main {
    static int n,m,sx,sy,ex,ey;

    static char map[][];
    static boolean visit[][];
    static boolean dui=false;
    static int move[][]={{1,0},{-1,0},{0,1},{0,-1}};
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        m = input.nextInt();
        String ss = input.nextLine();
        map = new char[n][m];
        visit = new boolean[n][m];
        sx=0;sy=0;ex=0;ey=0;
        for (int i = 0; i < n; i++) {
            String s = input.nextLine();
            for (int i1 = 0; i1 < m; i1++) {
                map[i][i1] = s.charAt(i1);
                if(s.charAt(i1)=='S')
                {
                    sx = i;
                    sy = i1;
                }
                if(s.charAt(i1)=='E')
                {
                    ex = i;
                    ey = i1;
                }
            }
        }
        visit[sx][sy] = true;
        dfs(sx,sy);
        if(dui)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
    public static void dfs(int x,int y)
    {
        visit[x][y] = true;
        if(x==ex&&y==ey||dui)
        {
            dui = true;
            return;
        }
        for(int i=0;i<4;i++)
        {
            int dx = x+move[i][0],dy = y +move[i][1];
            if(dx>=0&&dx<n&&dy>=0&&dy<m&&!visit[dx][dy]&&map[dx][dy]!='#'&&!dui)
            {
                dfs(dx,dy);
            }
        }
    }
}

参考毛冬晖的代码学习dfs深搜。第一步要明白,深搜的是什么,在这道题中,我们深搜的目标,就是不断前进不断探索,知道搜索到目的地为止。先来看主代码,先定义全局变量,n,m,sx,sy,ex,ey。分别是n行m列,宿舍坐标和东门坐标。map[][],visit[][],move[][]。分别是地图数组(自己输入的地图),探索数组,布尔值记录是否已经探索过(因为已经探索过的就不用继续探索了),移动数组(用于上下左右移动,这里的移动数组已经定义好,第一行向右,第二行向左,第三行向下,第四行向上。解释一下,这里有回退的情况呢,就是碰到了#或者是这里已经探索过,不用继续探索)。然后接下来是输入地图数组,输入地图的同时也要记录下S和E的位置。输入完毕,接下来是将探索数组的起点定义为true,然后进行dfs。

这里加粗是因为进入了最重要的步骤,dfs。首先以起点S的坐标开始深搜,开头将这一个点的探索坐标更改为true,表示已经搜索过。if语句是深搜结束条件,如果坐标是东门的坐标或者是“dui”这一个布尔值为true,那么就return(为什么还要再里面赋值一次,是因为当搜到E的时候,那么就可以直接结束,因为深搜是不停的嵌套,如果不将dui复制为true,那么将会一直深搜不能结束)。接下来是for循环空时移动。首先将进行右移,dx=1,dy=0。if条件都符合,那么继续深搜dfs(1,0),在dfs(1,0)中,探索数组visit[1][0]就为true表明这里搜索过,然后继续刚才的操作,知道找到E或者找不到E(为flase)。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务