牛客网——Kotori和迷宫

题目

kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?
题目传送门

输入描述

第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30)

后面紧跟着n行长度为m的字符串来描述迷宫。‘k’代表kotori开始的位置,’.‘代表道路,’*'代表墙壁,'e’代表出口。保证输入合法。

输出描述

若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)

若没有出口可以抵达,则输出-1。

思路

因为要找到所有出口数,而且要找到最小的那个,用广搜比较好【深度搜索也可以,只是每次都要去比较最优数值,比较麻烦】,广搜第一次出现的出口就是最优的那个。

只要到了出口了,就不能往下广搜了【题目只要到了出口就会离开】,所以要将队头节点给弹出去。

用一个count来计算总路径数目,用一个flag来标记是否找到了路径。方便最终结果的打印。

代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class  Point{
    int x;
    int y;
    int step;
}
public  class Main{
    static int n;//行数
    static int m;//列数

    //出发横纵坐标
    static int start_x;
    static int start_y;

    static int min=Integer.MAX_VALUE;//最小出口
    static boolean flag=false;
    static int count;//出口个数

    //右下左上
    static int d_x[]={0,1,0,-1};
    static int d_y[]={1,0,-1,0};

    static int visited[][]=new int[40][40];
    static char map[][]=new char[40][40];

    static Queue<Point> queue =new LinkedList();

    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        n=reader.nextInt(); //行数
        m=reader.nextInt(); //列数
        queue.clear();
        String blank=reader.nextLine();//接收空白回车符
        char temp;
        for (int i=1;i<=n;++i)
        {
            String test=reader.next();
            for (int j=1;j<=m;++j)
            {
                temp=test.charAt(j-1);
                map[i][j]=temp;
                if (temp=='k')
                {
                    start_x=i;
                    start_y=j;
                }
            }
        }


        Point start=new Point();
        start.x=start_x;
        start.y=start_y;
        start.step=0;
        visited[start_x][start_y]=1;
        queue.offer(start);

        while (!queue.isEmpty())
        {
            int x=queue.peek().x;
            int y=queue.peek().y;
            int step=queue.peek().step;
            if (map[x][y]=='e')
            {
                ++count;
                if (!flag)//第一次找到路径一定是最短的
                {
                    min=step;
                    flag=true;
                }
                queue.poll();
                continue;
            }
            for (int i=0;i<=3;++i)
            {
                int temp_x=x+d_x[i];
                int temp_y=y+d_y[i];
                if(check(temp_x,temp_y))
                {
                    Point g=new Point();
                    g.step=step+1;
                    g.x=temp_x;
                    g.y=temp_y;
                    visited[temp_x][temp_y]=1;
                    queue.offer(g);
                }
            }
            queue.poll();
        }
        //找得到路径,可以输出
        if (flag)
            System.out.println(count+" "+min);
        else //输出-1
            System.out.println("-1");

    }

    public static boolean check(int a,int b)
    {
        return a>=1 && a<=n && b>=1 && b<=m && (map[a][b]=='.' || map[a][b]=='e') && visited[a][b]==0;
    }
}

结果

在这里插入图片描述
对于迷宫广搜的模板,现在应该算是比较熟悉了,加油

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值