java 蓝桥杯 我们的征途是星辰大海

该博客介绍了一种使用Java实现的深度优先搜索(DFS)算法来解决蓝桥杯比赛中的迷宫问题。作者通过读取输入,初始化地图,寻找起点,并对每个询问进行DFS操作来判断是否能到达目标。在DFS过程中,判断当前位置是否越界、是否到达目标、是否遇到障碍,根据不同的情况输出不同的结果。这是一个简单的迷宫导航问题,适合初学者理解和练习DFS算法。
摘要由CSDN通过智能技术生成

java 蓝桥杯 DFS 我们的征途是星辰大海

问题描述
题目

样例输入:
  2
  2
  S.
  #T
  2
  RD
  DR
  3
  S.#
  .#.
  .T#
  3
  RL
  DDD
  DDRR
样例输出:
  I get there!
  I am dizzy!
  I have no idea!
  I am out!
  I get there!

思路分析

仔细阅读题目会发现其实这就是一个类似于走迷宫的简单问题,有必要注意的是样例的接收顺序,然后定义dfs方法,根据题目意思判断输出即可,具体的思路都在注释里了😁

import java.util.Scanner;

public class 星辰大海 {
	static char[][]map;
	static int n;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int k=sc.nextInt();
		//循环K次
		while (k-->0) {
			//接收n初始化地图
			n=sc.nextInt();
			map=new char[n][n];
			for (int i = 0; i < n; i++) {
				String str=sc.next();
				for (int j = 0; j < n; j++) {
					map[i][j]=str.charAt(j);
				}
			}
			//遍历地图找到'S'(找到起点的坐标)
			int x=0,y=0;
			for (int i = 0; i <n; i++) {
				for (int j = 0; j <n; j++) {
					if(map[i][j]=='S') {
						x=i;
						y=j;
					}
				}
			}
			//接收询问次数
			int q=sc.nextInt();
			for (int i = 0; i < q; i++) {
				String s=sc.next();
				//执行深搜 参数为x坐标,y坐标,从0开始的索引,询问字符串
				dfs(x,y,0,s);
			}
		}
	}
	public static void dfs(int x,int y,int index,String s){
		//边界判断!!!注意这个判断要放在第一,不然会爆
		if(x<0||y<0||x>=n||y>=n) {
			System.out.println("I am out!");
			return;
		}
		//询问字符串结束,并且所在点为T,说明到达目的地
		if(index==s.length()&&map[x][y]=='T') {
			System.out.println("I get there!");
			return;
		}
		//询问字符串结束,并且所在点不为T,说明没有到达目的地
		if(index==s.length()&&map[x][y]!='T') {
			System.out.println("I have no idea!");
			return;
		}
		//途中遇到障碍物!
		if(map[x][y]=='#') {
			System.out.println("I am dizzy!");
			return;
		}
		//指令没有结束就已经到达目的地
		if(map[x][y]=='T') {
        	System.out.println("I get there!");
    		return;
        }
		//左右上下走
		if(s.charAt(index)=='L') {
			dfs(x,y-1,index+1,s);
		}else if(s.charAt(index)=='R') {
			dfs(x,y+1,index+1,s);
		}else if(s.charAt(index)=='U') {
			dfs(x-1,y,index+1,s);
		}else if(s.charAt(index)=='D') {
			dfs(x+1,y,index+1,s);
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sssory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值