仙岛求药 —— dfs 与 bfs求解

2023-11-18

在这里插入图片描述
在这里插入图片描述样例输入1

8 8
.@##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.*…
.#…###

样例输出1

10

样例输入2

9 6
.#…#.
.#.*.#
.####.
…#…
…#…
…#…
…#…
#.@.##
.#…#.

样例输出2

-1

dfs

ps:使用dfs会运行超时,30组测试数据只能通过部分,其实这种最短路径、最少操作的问题最好还是靠bfs解决。

import java.util.Scanner;
//最短路径
public class Main{
	static int min=9999;  //步数
	static int []dx = {-1,0,0,1};
	static int []dy = {0,-1,1,0};
	static boolean flag = false;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt(); //n行
    	int m = sc.nextInt(); //m列
    	sc.nextLine();
    	char [][]table = new char[n][];
    	int [][]vis = new int[n][m];  //标记是否已访问    
    	for(int i=0;i<n;i++)
    		table[i] = sc.nextLine().toCharArray();
    	for(int i=0;i<n;i++){
    		for(int j=0;j<m;j++)
    		    if(table[i][j] == '@'){
    		    	dfs(table,n,m,i,j,vis,0);	
    		    }
    	    }
    	    
    	if(flag == true) System.out.println(min);
    	else System.out.println(-1);
   }

	private static void dfs(char[][] table, int n, int m, int i, int j,int[][] vis,int step) {
		if(table[i][j] == '*')  {  
			if(step < min) 
				min = step;
			return;
		}
		 
		for(int u=0;u<4;u++){
			int x = i+dx[u],y=j+dy[u];
			if(x>=0 && x<n && y>=0 && y<m && table[x][y] != '#' && vis[x][y] == 0){
				vis[x][y] = 1;  //已访问
				dfs(table, n, m, x, y, vis,step+1);
				vis[x][y] = 0; //回溯	
			}	
		}
		return;
	}  
}

bfs

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

public class Main{
    static int step = -1;  //步数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt(); 
    	int m = sc.nextInt(); 
    	sc.nextLine();
    	char [][]graph = new char[n][];
    	int [][]vis = new int[n][m];
    	
    	Queue<Node> queue = new LinkedList<>();
    	for(int i=0;i<n;i++)
    		graph[i] = sc.nextLine().toCharArray();
    	
    	for(int i =0;i<n;i++){
    		for(int j=0;j<m;j++){
    			if(graph[i][j] == '@')  queue.add(new Node(i,j,0));
    		}
    	}
    	
    	while(!queue.isEmpty()){
    		Node poll = queue.poll();
    		int x = poll.i;
    		int y = poll.j;
    		int deep = poll.depth;
    		vis[x][y] = 1;  //标记已访问
    		
    		//到达出口
    		if(graph[x][y] == '*'){
    			step = poll.depth;
    			break;
    		}
    		  		
    		//添加四个邻居
    		if(x-1 >=0 && x-1 < n  && graph[x-1][y] != '#' && vis[x-1][y] == 0){
    			queue.add(new Node(x-1,y,deep+1));
    		}
    		if(x+1 >=0 && x+1 < n  && graph[x+1][y] != '#' && vis[x+1][y] == 0){
    			queue.add(new Node(x+1,y,deep+1));
    		}
    		if(y-1 >=0 && y-1 < m  && graph[x][y-1] != '#' && vis[x][y-1] == 0){
    			queue.add(new Node(x,y-1,deep+1));
    		}
    		if(y+1 >=0 && y+1 < m  && graph[x][y+1] != '#' && vis[x][y+1] == 0){
    			queue.add(new Node(x,y+1,deep+1));
    		}
    	}
    	 System.out.print(step);
    }

	  static class Node{
		int i;
		int j;
		int depth;  //深度
		
		public Node(int i,int j,int depth){
			this.i = i;
			this.j = j;
			this.depth = depth;
		}
	  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仙岛求药 —— dfs 与 bfs求解 的相关文章

  • 软件测试方法汇总

    软件测试方法种类繁多 记忆起来混乱 如果把软件测试方法进行分类 就会清晰很多 我参考一些书籍和网上的资料 把常用的软件测试方法列出来 让大家对软件测试行业有个总体的看法 从测试设计方法分类 测试名称 测试内容 Black box黑盒测试 把

随机推荐

  • 洛谷-【入门4】数组

    1 小鱼比可爱 题目描述 人比人 气死人 鱼比鱼 难死鱼 小鱼最近参加了一个 比可爱 比赛 比的是每只鱼的可爱程度 参赛的鱼被从左到右排成一排 头都朝向左边 然后每只鱼会得到一个整数数值 表示这只鱼的可爱程度 很显然整数越大 表示这只鱼越可
  • 实战wxPython:049 - 实现一个登录窗口

    在很多GUI程序中 常常在应用启动开始的时候 需要一个用户登录对话框 在那里用户必须输入用户名和密码 如果密码和用户名正确 那么程序就继续加载 显示程序的主界面 下面我们将实现一个登录窗口 它具有以下功能 输入用户名及密码 登录 如果用户名
  • spring boot 2.2.6.RELEASE集成 eureka启动报错

    1 报错信息 org springframework cloud client discovery health DiscoveryCompositeHealthIndicator DiscoveryCompositeHealthIndic
  • MongoDB创建与删除集合(collection)

    一 创建集合 MongoDB的集合相当于关系型数据库的表 不过在创建集合时 执行指定集合名称与选项即可 无需指定类似RDBMS的列名 创建集合的语法为 db createCollection name option 其中 name是集合的名
  • 前端面试题--计算机网络

    文章目录 1 七层网络协议体系结构的理解 2 五层协议中各自对应的网络协议 3 ARP 协议的工作原理 4 IP 地址分类的理解 5 TCP 的主要特点 exclamation exclamation Transmission Contro
  • 推荐几个容易中的计算机EI源刊(基本百发百中)

    转自小木虫 作者 pcmagic 收录 2012 05 27 发布 2012 05 20 根据多年的经验 以下计算机EI源刊可以说是百发百中 只要有工作量 并不需要什么创新性均可录用 Journal of Computers JCP ISS
  • SDUTOJ KMP简单应用 【KMP】

    KMP简单应用 Time Limit 1000MS Memory limit 65536K 题目描述 给定两个字符串string1和string2 判断string2是否为string1的子串 输入 输入包含多组数据 每组测试数据包含两行
  • 单片机外设基本概念_嵌入式单片机教学(一)

    01 引言 哈喽各位 好久不见 看到标题应该知道 小白 又要 给大家 开启一系列的新教程了 肯定有人说我跨度还蛮大的 从ROS到神经网络又到嵌入式教学 其实这些都是小白在本科期间学到的一些知识啦 这边分享给大家 让不知道怎么做项目的小小白能
  • Ubuntu16.04及ROS Kinetic环境下安装使用RealSense SR300

    Ubuntu16 04及ROS Kinetic环境下安装使用RealSense SR300 1 准备条件 需要安装Ubuntu16 04及ROS Kinetic 2 安装驱动 安装realsense的驱动流程可以根据Github上的官方推荐
  • C#获取本机主机名—三种方式

    前提条件 引用名称空间 using System Net 建议 使用方式3 本人使用前2种方式都存在字符串自动截取的情况 方式1 Environment 获取本地计算机名 string machineName System Environm
  • 前端基础--主流浏览器及其内核

    IE trident Chrome webkit blink firefox Gecko Opera presto Safari webkit 内核主要分成两部分 渲染引擎 layout engineer或 Rendering Engine
  • Wrapper中的QueryWrapper常用ge,gt,lt,le具体含义

    英文缩写 英文全拼 含义 EQ equal 等于 NE not equal 不等于 GT greater than 大于 LT less than 小于 GE greater than or equal 大于等于 LE less than
  • centos7.3安装mysql5.7 && 解决 Access denied for user 'root'@'localhost' (using password: NO)

    开始查找自带的mariadb rpm qa grep mariadb 找到安装包并卸载 rpm e mariadb安装包 卸载完之后 我们就可以开始安装mysql5 7了 在这里可以找到我们需要的点击这里 鼠标放在最下面那个No thank
  • React仿写网易云音乐项目

    文章目录 一 项目功能说明 二 最终效果 三 文件目录结构说明 四 项目技术栈 五 核心技术 1 配置项目别名 craco craco 2 使用reset css进行 css 重置 3 使用CSS Sprites 精灵图 4 使用 memo
  • Java语言通过三种方法来实现队列

    队列 关于作者 作者介绍 博客主页 作者主页 简介 JAVA领域优质创作者 一名在校大三学生 在校期间参加各种省赛 国赛 斩获一系列荣誉 关注我 关注我学习资料 文档下载统统都有 每日定时更新文章 励志做一名JAVA资深程序猿 文章目录 队
  • 实现框架的类的方法为什么会在众多集成者中被调用

    以activities为例 实现了 author Tom Baeyens public interface Command
  • LVM磁盘扩容

    一 一块磁盘新增容量后加到lv里面去 一般在虚拟机里面出现这种情况多 这种方式需要重启 1 对新增磁盘空间进行分区 fdisk dev sda 注意 Selected partition 后要对分区的类型做改变 一定要选择t 8e 改变分区
  • Python .whl安装包简介和制作

    python 文章目录 python 前言 一 构建工程文件 二 封装Python包 三 制作python包为wheel文件 四 完整示例 小结 前言 Wheel和Egg都是python的打包格式 目的是支持不需要编译或制作的安装过程 实际
  • 脚本语言和编译语言的区别

    之前学了很多语言 例如c c Java c Python 突然想知道他们是怎么分类的 突然有疑问什么是编译语言 什么是脚本语言 查了一些资料 有了简单的初步了解 下面是总结的一部分内容 如果有什么问题敬请指正 什么是脚本语言 脚本语言是一种
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner