当前位置: 首页 > news >正文

P1825 [USACO11OPEN] Corn Maze S【java】【AC代码】

去年秋天,农夫约翰带着奶牛们参观了一个玉米迷宫。但这不是一个普通的玉米迷宫:它有几个重力驱动的传送滑梯,可以让奶牛瞬间从迷宫中的一个点传送到另一个点。滑梯是双向的:奶牛可以瞬间从滑梯的起点滑到终点,或者从终点滑到起点。如果奶牛踩到滑梯的任一端,她必须使用滑梯。

玉米迷宫的外部完全由玉米包围,只有一个出口。

迷宫可以用一个 N×M(2≤N≤300;2≤M≤300)的网格表示。每个网格元素包含以下项目之一:

* 玉米(玉米网格元素不可通行)

* 草地(容易通过!)

* 滑梯端点(会将奶牛传送到另一个端点)

* 出口

奶牛只能从一个空间移动到相邻的下一个空间,前提是它们相邻且都不包含玉米。每个草地空间有四个潜在的邻居可以让奶牛到达。从一个草地空间移动到相邻空间需要 1 个时间单位;从一个滑梯端点移动到另一个端点需要 0 个时间单位。

填满玉米的空间用井号(#)表示。草地空间用句号(.)表示。滑梯端点对用相同的大写字母(A-Z)表示,并且没有两个不同的滑梯端点用相同的字母表示。出口用等号(=)表示。

贝茜迷路了。她知道自己在网格中的位置,并用「at」符号(@)标记了她当前的草地空间。她需要的最短时间是多少才能移动到出口空间?

输入格式

第一行:两个用空格隔开的整数 N 和 M。

第 2∼N+1 行:第 i+1 行描述了迷宫中的第 i 行的情况(共有 M 个字符,每个字符之间没有空格)。

输出格式

一个整数,表示起点到出口所需的最短时间。

思路:

其余的点正常进行bfs遍历就可以了,主要是传送门的处理,当访问到传送起点时,要先标记起点被访问,而不是标记那个传送终点,如果搞错了这个顺序,某个点可能就出不来了。

运行代码:


import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static int N,M,x1,y1;
	static char[][] maze = new char[302][302];
	static boolean[][] vis = new boolean[302][302];
	static int[][] ch1 = new int[26][2];
	static int[][] ch2 = new int[26][2];
	static int[] fx = {0,0,1,-1};
	static int[] fy = {1,-1,0,0};
	
	public static void main(String[] args)throws IOException {
		String[] s = br.readLine().split("\\s+");
		N = Integer.parseInt(s[0]);M = Integer.parseInt(s[1]);
		for (int i = 1; i <= N; i++) {
			String str = br.readLine();
			for (int j = 1; j <= M; j++) {
				maze[i][j] = str.charAt(j-1);
				if(maze[i][j] == '@') {x1 = i;y1 = j;}
				if(maze[i][j] >= 'A' && maze[i][j] <= 'Z') {
					if(ch1[maze[i][j]-'A'][0]!=0) {
						ch2[maze[i][j]-'A'][0] = i;
						ch2[maze[i][j]-'A'][1] = j;
					}else {
						ch1[maze[i][j]-'A'][0] = i;
						ch1[maze[i][j]-'A'][1] = j;
					}
				}
			}
		}
		bfs(x1,y1);
		

	}
	static void bfs(int x,int y) {
		node start = new node();
		start.x = x;start.y = y;start.step = 0;
		Queue<node> q = new LinkedList<>();
		q.offer(start);
		while(!q.isEmpty()) {
			node tmp = q.poll();
			if(maze[tmp.x][tmp.y] == '=') {
				System.out.println(tmp.step);System.exit(0);
			}

			//表示已经访问过了,堵住
			for (int i = 0; i < 4; i++) {
				int dx = tmp.x + fx[i],dy = tmp.y + fy[i];
				//超出地图
				if(dx < 1 || dx > N || dy < 1 || dy > M || vis[dx][dy])continue;
				//障碍物
				char l = maze[dx][dy];
				if(l=='#')continue;
				vis[dx][dy] = true;
				//传送点——直接传送
				if(l>='A' && l<='Z') {
					if(dx==ch1[l-'A'][0] && dy == ch1[l-'A'][1]) {
						dx = ch2[l-'A'][0];dy = ch2[l-'A'][1];
					}else if(dx==ch2[l-'A'][0] && dy == ch2[l-'A'][1]){
						dx = ch1[l-'A'][0];dy = ch1[l-'A'][1];
					}
				}
				node temp = new node();
				temp.x = dx;temp.y = dy;temp.step = tmp.step + 1;
				q.offer(temp);
			}
		}
	}
}
class node{
	int x;
	int y;
	int step;
}

http://www.dtcms.com/a/123057.html

相关文章:

  • C++:函数模板类模板
  • 什么是巨型帧Jumbo Frames?云服务器开启巨型帧有什么用?
  • 2025年4月9日-华为暑期实习-第二题-200分
  • 动态类生成 / 加载机制(更新)
  • Java集合框架:核心接口与关系全解析
  • springboot中测试python脚本:ProcessBuilder
  • 如何使用 PyTorch 和 EfficientNet 创建一个 AI 游戏外挂[特殊字符]
  • 基于MCP协议调用的大模型agent开发03
  • InnoDB 事务更新过程深度剖析:原理、流程与优化
  • 前端-vue2核心
  • 如何用postman做接口自动化测试?
  • Seata框架,如何保证事务的隔离性?
  • 【时时三省】(C语言基础)用switch语句实现多分支选择结构
  • 【运维 | 硬件】服务器中常见的存储插槽类型、对应的传输协议及其特性总结
  • 环信鸿蒙版 UIKit 快速上手指南
  • 如何将多个Word文档合并
  • 【HTML】动态背景效果前端页面
  • 基于 Qt4 的图片处理工具开发(二):增加对比度调节、界面布局优化、多线程操作
  • 初识Redis · 简单理解Redis
  • 使用注解@RequestBody变红的解决问题
  • 【spark认任务提交】配置优先级顺序
  • 银河麒麟v10(arm架构)部署Embedding模型bge-m3【简单版本】
  • 【C++进阶】关联容器:multimap类型
  • 学习海康VisionMaster之四边形查找
  • 【达梦数据库】bash: /dev/null: Permission denied
  • 使用stm32cubeide stm32f407 lan8720a freertos lwip 实现tcp客户端、服务端及网络数据转串口数据过程详解
  • SQL 关键字
  • 低硬件资源微调预训练Mamba模型的方法
  • 在 transformers 中,return_tensors=‘pt‘ 里的 pt 是什么 tf,np
  • gdal_shp文件的组成