华为OD机试之羊、狼、农夫过河(Java源码)

news/2024/7/20 17:18:38 标签: java, 开发语言, 华为OD

羊、狼、农夫过河

题目描述

羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。
要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算农夫去对岸的次数,回程时农夫不会运送羊和狼。
备注:农夫在或农夫离开后羊的数量大于狼的数量时狼不会攻击羊。

输入描述

第一行输入为M,N,X, 分别代表羊的数量,狼的数量,小船的容量。

输出描述

输出不损失羊情况下将全部羊和狼运到对岸需要的最小次数(若无法满足条件则输出0)。

输入5 3 3
输出3
说明

第一次运2只狼

第二次运3只羊

第三次运2只羊和1只狼

输入5 4 1
输出0
说明如果找不到不损失羊的运送方案,输出0

源码和解析
解析:

  1. 确保两岸的羊无论何时都不能出现羊的数量小于等于狼的数量,即羊的数量-狼的数量>=1
  2. 可以按分组的形式每次运输一个动物,从而得到一个可能存在的单个顺序记录 例如20只羊 8只狼 船容量为5
    [g, g, g, g, g, g, g, g, g, g, g, w, g, w, g, w, g, w, g, w, g, w, g, w, g, w, g, g]
  3. 将2中得到的顺序按船容量进行合并
    3.1 确保每次运输尽可能多的带动物
    3.2 若带5个过去,可能出现本岸或对岸狼吃羊的情况,那么就得少带
    3.3 使用双指针进行合并

示例代码:

java">import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T34 {
	public static void main(String[] args) {
		String input = "20 8 5";
		int ghostNumber = Integer.parseInt(input.split(" ")[0]);
		int wolfNumber = Integer.parseInt(input.split(" ")[1]);
		int shipCapacity = Integer.parseInt(input.split(" ")[2]);
		List<String> shifLog = new ArrayList<String>();// 转移记录 每次转移一个
		while (ghostNumber + wolfNumber > 0) {
			// 羊或者狼还没运输完 运输时优先确保对岸的羊不比狼少 而本岸的则确保羊比狼多一个即可 由于是单次运输 所以对岸的羊可能会和狼一样多
			if (ghostNumber - wolfNumber > 1) {
				// 运输一个羊
				ghostNumber--;
				shifLog.add("g");
				continue;
			}
			if (wolfNumber > 0) {
				// 否则运输狼
				wolfNumber--;
				shifLog.add("w");
			} else {
				// 只剩一个羊
				ghostNumber--;
				shifLog.add("g");
			}
		}
		System.out.println(shifLog);
		// 来检测单个运输过程 是否可以合并为一次的 求出最小运输次数
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("g", 0);
		map.put("w", 0);
		int count = 0; // 运输了几次
		int left = 0;
		int right = shipCapacity;// 第一次运算
		wolfNumber = Integer.parseInt(input.split(" ")[1]);
		shipCapacity = Integer.parseInt(input.split(" ")[2]);
		if (left == right - 1 && ghostNumber - wolfNumber < wolfNumber) {
			// 船容量是1 且羊的数量不是狼的2倍 那么这样是不可能移动成功的
			System.out.println(0);
			System.exit(0);
		}
		while (left < shifLog.size()) {
			int wN = 0;
			int gN = 0;
			int onceCount = 0;
			for (int i = 0; i < right - left; i++) {
				if (left + i >= shifLog.size()) {
					break;
				}
				onceCount++;
				if (shifLog.get(left + i).equals("w")) {
					wN++;
				} else {
					gN++;
				}
			}
			if (map.get("g") + gN > map.get("w") + wN) {
				count++;
				map.put("g", map.get("g") + gN);
				map.put("w", map.get("w") + wN);
				left += onceCount;
				right += shipCapacity;
				// 这是一次有效的运输 指针右移到下一次
				System.out.println("第" + count + "次有效运输,运输的羊和狼为:" + gN + ":"
						+ wN);
			} else {
				right--;
			}
		}
		System.out.println(count);
	}
}

上述代码的执行过程如下图:

在这里插入图片描述


http://www.niftyadmin.cn/n/371164.html

相关文章

几个提高工作效率的 Python 自动化脚本,收藏!

在这个自动化时代&#xff0c;我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情&#xff0c;让它自动化&#xff0c;让你的生活更轻松。 那么在本文中&#xff0c;我将向您介绍 10 个 Python 自动化脚本&#xff0c;以使你的工作更加自动化&#…

浅谈安科瑞霍尔传感器在转速测量中的选型与应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要&#xff1a;在现代工业生产中存在许多需要转速测量的方面&#xff0c;针对转速测量方法落后、只能进行接触式测量等问题&#xff0c;提出把霍尔传感器应用于工业生产中 , 利用霍尔效应测量转速&#xff0c;具有动…

KD7742交直流耐压绝缘分析仪

一、产品简介 KD7742交直流耐压绝缘分析仪具有交/直流耐压、绝缘电阻等项目的测试分析功能&#xff0c;能显示电压、电流和电阻的波形图以及趋势图&#xff0c;以便更直观的监测分析绝缘性能和绝缘崩溃时的各项指标&#xff0c;适用于高要求的测试分析场合。 产品具有测试参数范…

vue如何给页面切换增加动画效果?

Vue.js 提供了 <transition> 组件以在插入、更新或移除 DOM 时应用过渡效果。它允许在元素或组件进入/离开时应用 CSS 过渡或动画&#xff0c;并允许在同一时间触发 JavaScript 动画和钩子函数。 你可以为路由更改添加过渡效果。在你的 Vue 路由组件中使用 <transiti…

vue+elementUI表格某一行修改局部刷新实现

log: 使用elementUI表格&#xff0c;想修改某一行数据然后不想全量刷新&#xff0c;只想刷新当前修改的行内容 实现过程&#xff1a; 表格操作列代码&#xff1a; 1.主要是获取下标和行内容&#xff1a;scope.$index,scope.row <el-table-column width"200" …

解析云盘存储的优缺点:安全靠谱还是存在风险?

云盘是一种基于云计算技术的在线存储服务&#xff0c;用户可以通过互联网将文件上传到云端&#xff0c;并可以随时随地通过网络访问这些文件。 相较于传统的本地存储&#xff0c;云盘具有以下优势&#xff1a; 1.数据安全性更高&#xff1a;云盘使用专业的云计算技术和安全措施…

PUSH消息推送的实现原理

PUSH消息推送的实现原理_腾讯新闻 编辑导语&#xff1a;如今&#xff0c;push已经成为了我们手机信息流的一种推广方式&#xff0c;那么push消息推送是如何实现的呢&#xff1f;作者总结了几种消息推送的类型以及实现原理&#xff0c;一起来看看。 一、消息推送的类型 1. 短信…

Maven初级

Maven初级 Maven简介 传统项目管理状态分析 jar包不统一&#xff0c;jar包不兼容工程升级维护过程操作繁琐 Maven是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;POM&#xff1a;项目对象模型 Ma…