`
mabusyao
  • 浏览: 254494 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

CraneWork

 
阅读更多

/*Problem Statement
There are three stacks of crates - two of them outside of the warehouse, and one inside the warehouse.
We have a crane that can move one crate at a time, and we would like to move all of the crates to the stack inside the warehouse.
A heavier crate can never be stacked on top of a lighter crate, and all three initial stacks obey that rule.
Create a class CraneWork that contains a method moves that is given int[]s stack1, stack2, and warehouse containing the initial three stacks,
and returns the minimum number of moves required to move all the crates into the warehouse stack.
The elements of stack1, stack2, and warehouse represent the weights of the crates and are given from top to bottom
(and thus in non-decreasing order of weight).

Definition
Class: CraneWork
Method: moves
Parameters: int[], int[], int[]
Returns: int
Method signature: int moves(int[] stack1, int[] stack2, int[] warehouse)
(be sure your method is public)

Constraints
stack1, stack2, and warehouse will each contain between 0 and 20 elements, inclusive.
The total number of elements in the three stacks will be between 1 and 20, inclusive.
Each element in the three stacks will be between 1 and 200, inclusive.
stack1, stack2, and warehouse will each be in non-decreasing order.

Examples

0){3,50} {} {1,2,50,50,50}
Returns: 12
Move 3 to stack2, 1 to stack1,
2 to stack2, 1 to stack2,
50 to warehouse, 1 to warehouse,
2 to stack1, 1 to stack1,
3 to warehouse, 1 to stack2,
2 to warehouse, 1 to warehouse.

1){50} {50} {10,20,30}
Returns: 17
Start by moving 50 from stack2 to stack1.
It then takes 7 moves to transfer the 10,20,30
to stack 2, 2 moves to transfer the 2 50's to the warehouse,
and 7 more to transfer the 10,20,30 to the warehouse.

2){} {} {2,5,6,7}
Returns: 0
All the crates are already in the warehouse.

3){1,2,3} {} {}
Returns: 7
Move 1 from stack1 to warehouse, 2 from stack1 to stack2,
1 from warehouse to stack2, 3 from stack1 to warehouse,
1 from stack2 to stack1, 2 from stack2 to warehouse, 1 from stack1 to warehouse.

This problem statement is the exclusive and proprietary property of TopCoder, Inc.
Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc.
is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved. */

package cranework_2;

public class CraneWork {

public static void moves(int[] stack_1, int[] stack_2, int[] ware_house) throws Exception{
CrateStack stack1 = new CrateStack(stack_1);
CrateStack stack2 = new CrateStack(stack_2);
CrateStack warehouse = new CrateStack(ware_house);

show(stack1, stack2, warehouse);
moves(stack1, 0, stack2, 0, warehouse, 0);
}

/**
* @param stack1
* @param cursor1
* @param stack2
* @param cursor2
* @param stack3
* @param cursor3
* @throws Exception
*/
public static void moves(CrateStack stack1, int cursor1, CrateStack stack2, int cursor2, CrateStack stack3, int cursor3) throws Exception{

if(cursor1 == stack1.root && cursor2 == stack2.root) return;

if(cursor1 == stack1.root) {
if(cursor3 == stack3.root) {
moves(stack2, cursor2 + 1, stack3, stack3.root, stack1, stack1.root);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
} else if (stack2.getValue(cursor2) > stack3.getValue(cursor3)) {
moves(stack2, cursor2 + 1, stack3, cursor3, stack1, stack1.root);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
}else {
cursor3 = stack3.find(stack2.getValue(cursor2));

moves(stack2, cursor2 + 1, stack3, cursor3, stack1, stack1.root);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
}
} else if(cursor2 == stack2.root) {
if(cursor3 == stack3.root) {
moves(stack1, cursor1 + 1, stack3, stack3.root, stack2, stack2.root);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
} else if (stack1.getValue(cursor1) > stack3.getValue(cursor3)) {
moves(stack1, cursor1 + 1, stack3, cursor3, stack2, stack2.root);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
}else {
cursor3 = stack3.find(stack1.getValue(cursor1));

moves(stack1, cursor1 + 1, stack3, cursor3, stack2, stack2.root);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
}
} else if(cursor3 == stack3.root) {
if (stack1.getValue(cursor1) > stack2.getValue(cursor2)) {
moves(stack1, cursor1 + 1, stack3, stack3.root, stack2, cursor2);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
} else {
moves(stack2, cursor2 + 1, stack3, stack3.root, stack1, cursor1);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
}
} else if (stack3.getValue(cursor3) > stack2.getValue(cursor2) && stack3.getValue(cursor3) > stack1.getValue(cursor1)) {
if (stack1.getValue(cursor1) > stack2.getValue(cursor2)) {

cursor3 = stack3.find(stack1.getValue(cursor1));

moves(stack1, cursor1 + 1, stack3, cursor3, stack2, cursor2);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
} else {
cursor3 = stack3.find(stack2.getValue(cursor2));

moves(stack2, cursor2 + 1, stack3, cursor3, stack1, cursor1);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
}
} else {
if (stack1.getValue(cursor1) > stack2.getValue(cursor2)) {
moves(stack1, cursor1 + 1, stack3, cursor3, stack2, cursor2);

stack3.pushCrate(stack1.popCrate());

show(stack1, stack2, stack3);

moves(stack2, cursor2, stack1, stack1.root, stack3, stack3.root);
}
else {
moves(stack2, cursor2 + 1, stack3, cursor3, stack1, cursor1);

stack3.pushCrate(stack2.popCrate());

show(stack1, stack2, stack3);

moves(stack1, cursor1, stack2, stack2.root, stack3, stack3.root);
}
}
}

public static void show(CrateStack stack1, CrateStack stack2, CrateStack stack3){
System.out.println("Round:");
stack1.showStack();
stack2.showStack();
stack3.showStack();
//System.out.print("\n " + cursor1.weight + " " + cursor2.weight + " " + cursor3.weight);
System.out.println("\n");
}
}

class CrateStack {

private int[] stack = new int[20];

public int root = 0;

public CrateStack(int weight) {
stack[0] = weight;
root++;
}

public CrateStack(int[] array) {
for(int i = 0; i < array.length; i++) {
stack[i] = array[i];
}
root = array.length;
}

//Push a Value into Stack
public void pushCrate(int value) {
stack[root] = value;
root++;
}

//Pop a Value into Stack
public int popCrate() throws Exception{
if(root != 0) {
root--;
int result = stack[root];
stack[root] = 0;
return result;
}
throw new NullPointerException();
}


public boolean isTop(int cursor) {
if(cursor == root - 1) return true;
return false;
}

public void showStack() {
try {
if (root == 0) {
System.out.print("{}");
} else {
int temp = root - 1;
System.out.print("{");
while (temp >= 0) {
System.out.print(stack[temp] + ",");
temp--;
}
System.out.print("}");
}
} catch (Exception e) {
//
}
}

public int find (int temp) {
int cursor = 0;
if (temp != 0) {
while(cursor != root) {
if (stack[cursor] < temp) return cursor;
cursor++;
}
}

return root;
}

public int getValue(int index) {
return stack[index];
}

}


遗憾的是如果有重量相同的情况还没有解决。

分享到:
评论
1 楼 mabusyao 2012-02-17  
某位同学给我提供的堪称完美的解决方案:

1. 将三个int数组放在一起排序,生成这样一个char数组[A,B,C,C,C,A,B,B,A].
2. 简单的move方法
	private static void move(char[] stack, int index, char to) {
		if (index == 0) {
			if (stack[index] == to) {
				// Do nothing.
			} else {
				System.out.println("move stack from " + stack[0] + " to " + to);
				stack[0] = to;
			}

			return;
		} else {
			if (stack[index] == to) {
				move(stack, index - 1, to);
			} else {
				move(stack, index - 1, getMidum(stack[index], to));

				System.out.println("move stack from " + stack[index] + " to "
						+ to);
				stack[index] = to;

				move(stack, index - 1, to);
			}

		}
	}

经测试可行,且为最优解

相关推荐

    微生物细胞壁中S层蛋白的功能与结构解析及其应用前景

    内容概要:本文深入探讨了微生物表面层次(S-layer)蛋白质的结构和功能,尤其关注其在古菌和细菌中的角色。文中详细介绍了S层结构特征,如形成二維晶格的方式以及与其他细胞外膜成分的相互作用机制。对于S层的具体生物学作用——从保护细胞到适应环境变化——都有详尽论述,并且对不同种类微生物S层的特异性进行了分类比较。此外,还提到了当前的研究热点和潜在的应用领域。 适合人群:生物学家、微生物学家及其他生命科学研究人员;对细胞生物学特别是细胞壁研究感兴趣的学生及专业人士。 使用场景及目标:作为参考资料帮助科学家理解S层的物理化学属性,为实验设计提供思路,推动相关领域学术交流与发展;也为寻找新的工业材料和技术提供了理论依据。 阅读建议:鉴于论文的技术性强且内容丰富复杂,在初读时可以先把握各章节的大致意义,后续针对个人感兴趣的专题进一步深入了解。由于涉及到大量的分子生物学知识,请确保读者有良好的背景基础。同时推荐配合最新的科研报道一同学习以获取最新进展。

    一个简单的Python爬虫示例,使用了requests库来发送HTTP请求,以及BeautifulSoup库来解析HTML页面 这个示例将从一个简单的网页中获取标题并打印出来

    python爬虫,一个简单的Python爬虫示例,使用了requests库来发送HTTP请求,以及BeautifulSoup库来解析HTML页面。这个示例将从一个简单的网页中获取标题并打印出来。

    深度学习中全连接神经网络与卷积神经网络融合用于猫狗二分类任务(PyTorch实现)-含代码设计和报告

    内容概要:本文介绍了一种使用PyTorch构建的深度学习模型,该模型结合了一个包含一个隐藏层的全连接神经网络(FCN)和一个卷积神经网络(CNN)。模型用于解决CIFAR-10数据集中猫狗图片的二分类问题。文章详细描述了从数据预处理到模型架构设计、融合方式选择、损失函数设定以及训练和测试流程。实验证明,模型的有效性和融合的优势得到了显著体现。 适用人群:面向具有一定机器学习和Python编程基础的研究人员和技术爱好者。 使用场景及目标:本项目的目的是提供一种可行的猫狗分类解决方案,同时帮助研究者深入了解两类网络的工作机制及其协作的可能性。 其他说明:文中不仅展示了完整的代码片段,还讨论了多种改进方向如结构优化、预处理策略、超参数调节、引入正则化技术等。 本项目适合有兴趣探究全连接网路与卷积网络结合使用的从业者。无论是初学者想要加深对这两类基本神经网络的理解还是希望找到新的切入点做相关研究的专业人士都可以从中受益。 此资源主要用于指导如何用Python(借助于PyTorch框架)实现针对特定分类任务设计的人工智能系统。它强调了实验的设计细节和对关键组件的选择与调优。 此外,作者还在最后探讨了多个可用于改善现有成果的方法,鼓励大家持续关注并试验不同的改进措施来提升模型性能。

    简传-win-1.4.1-x64.exe

    简传1.4.1 windows安装包,支持局域网内文件和文本的传输,可以跨操作系统

    地面无线电台(站)设置使用申请表.xlsx

    地面无线电台(站)设置使用申请表.xlsx

    【Python】Python爬虫实战--小猪短租爬虫_pgj.zip

    【Python】Python爬虫实战--小猪短租爬虫_pgj

    comsol模型,变压器匝间短路5%,电磁场,二维模型,瞬态 包括电流变化曲线,正常与匝短后的绕组上的轴向磁密和辐向磁密波形与分布,铁心的磁密变化

    comsol模型,变压器匝间短路5%,电磁场,二维模型,瞬态 包括电流变化曲线,正常与匝短后的绕组上的轴向磁密和辐向磁密波形与分布,铁心的磁密变化

    数据分析-63-基于逻辑回归模型的医疗数据分析(拟合度差)

    文中使用了逻辑回归模型对病人如约就诊与相关变量进行分析,结果发现该数据对逻辑回归模型的拟合程度很差,需要在后续使用其他模型进行进一步的拟合。因此,**该文章未能成功探索到相关变量和如约就诊之间的关系,不能提供准确的参考,可以作为小白的逻辑回归模型流程参照使用**。且待后续更新(课程和考试繁忙,学习进度较为缓慢,尚在学习中,但一定会进行补充)

    QQ空间全能王软件易语言源码【赠送 易语言模块+易语言教程】

    QQ空间全能王软件易语言源码【赠送 易语言模块+易语言教程】 一、QQ空间全能王软件易语言源码 二、QQ空间全能王软件易语言模块 三、赠送2套易语言教程 1、价值150易语言视频教程光盘 2、价值900E锦学院易语言POST+JS实战,仅供学习研究 QQ空间全能王软件易语言源码【赠送 易语言模块+易语言教程】

    2023-04-06-项目笔记 - 第三百六十八阶段 - 4.4.2.366全局变量的作用域-366 -2025.01.04

    2023-04-06-项目笔记-第三百六十八阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.366局变量的作用域_366- 2025-01-04

    【组合导航】基于matlab卡尔曼滤波KF IMU和UWB融合高精度定位组合导航【含Matlab源码 10905期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    GUI(1)代码.doc

    java面向对象程序设计实验报告

    Java学生信息管理系统(MySQL版)源码+数据库+文档说明.zip

    Java学生信息管理系统(MySQL版)源码+数据库+文档说明.zip,含有代码注释,满分大作业资源,新手也可看懂,期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为课程设计期末大作业使用,该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 Java学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zipJava学生信息管理系统(MySQL版)源码+数据库+文档说明.zi

    多时间尺度滚动优化的多能源微网双层调度模型 参考文档:Collaborative Autonomous Optimization of Interconnected Multi-Energy Sys

    多时间尺度滚动优化的多能源微网双层调度模型 参考文档:《Collaborative Autonomous Optimization of Interconnected Multi-Energy Systems with Two-Stage Transactive Control Framework》 代码主要做的是一个多能源微网的优化调度问题,首先对于下层多能源微网模型,考虑以其最小化运行成本为目标函数,通过多时间尺度滚动优化求解其最优调度策略,对于上层模型,考虑运营商以最小化运营成本为目标函数,同时考虑变压器过载等问题,构建了一个两阶段优化模型,通过互补松弛条件以及KKT条件,对模型进行了化简求解。

    Multimodal Deep Learning

    内容概要:《Multimodal Deep Learning.pdf》是一本深入探讨多模态深度学习的专业书籍,涵盖自然语言处理(NLP)和计算机视觉(CV)领域最新的研究进展与应用实例。本书按照时间顺序介绍了该领域的演进过程和技术背景,并详细讲解了将不同模态数据转换或融合的技术框架,如图像到文本、文本到图像、支持视觉的语言模型和支持语言的视觉模型等。同时书中也对未来的发展趋势进行了展望并提出了当前技术存在的挑战及改进方向,最后强调了几款最新发布的架构的重要性以及向视频扩展的可能性。 适合人群:对自然语言处理、计算机视觉有浓厚兴趣的研究人员、工程师或者学生,尤其是从事相关技术开发工作的读者。 使用场景及目标:帮助用户了解多模态深度学习的核心原理;为开发者提供实用的参考工具;激发新的科研创意和技术突破。 阅读建议:鉴于这本书籍内容丰富且前沿,在阅读过程中应当关注每一章节所涉及的基本概念和具体案例之间的联系,结合实际应用场景理解各部分内容,并尝试复现文中提到的关键实验以加强记忆。此外,随着该领域快速发展,鼓励持续追踪最新的文献报道来补充书内的知识点。

    matlab 滤波器设计,基于matlab的模拟滤波器和数字滤波器设计,其中数字滤波器包扩IIR和FIR的低通、高通、带通、带阻四大类型,模拟滤波器包括巴特沃斯(Butterworth)和切比雪夫(C

    matlab 滤波器设计,基于matlab的模拟滤波器和数字滤波器设计,其中数字滤波器包扩IIR和FIR的低通、高通、带通、带阻四大类型,模拟滤波器包括巴特沃斯(Butterworth)和切比雪夫(Chebyshev)算法下的低通、高通、带通、带阻四种类型。

    关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载;MATLAB Simulink;顶刊复现,有意者加好友;设有粉丝价,本模型不,运行时间较长耐心等待 主题:提出

    关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载;MATLAB Simulink;顶刊复现,有意者加好友;设有粉丝价,本模型不,运行时间较长耐心等待 主题:提出了一种新的基于一致性算法的直流微电网均流和均压二级控制方案,该微电网由分布式电源、动态RLC和非线性ZIE(恒阻抗、恒电流和指数型)负载组成。 分布式二级控制器位于初级电压控制层(下垂控制层)之上,并利用通过与邻居通信来计算必要的控制动作。 除了表明在稳定状态下总是能达到预期的目标之外,还推导了恒功率负载(即零指数负载)平衡点存在和唯一的充分条件。 该控制方案仅依赖于本地信息,便于即插即用。 最后提供了电压稳定性分析,并通过仿真说明了该方案的优秀性能和鲁棒性。

    管理工程系学生周五和周六晚不住校申请表.doc

    管理工程系学生周五和周六晚不住校申请表.doc

    【C++】哔哩哔哩直播万能场控机器人,弹幕姬+答谢姬+回复姬+点歌姬+各种小骚操作,目前唯一可编程机器人.zip

    【C++】哔哩哔哩直播万能场控机器人,弹幕姬+答谢姬+回复姬+点歌姬+各种小骚操作,目前唯一可编程机器人

    自适应大领域搜索算法(ALNS)matlab解决tsp问题,与传统大规模领域搜索算法(LNS)相比收敛性强,运行时间短,很好的学习资料

    自适应大领域搜索算法(ALNS)matlab解决tsp问题,与传统大规模领域搜索算法(LNS)相比收敛性强,运行时间短,很好的学习资料

Global site tag (gtag.js) - Google Analytics