ACM/ICPC HDU 1195

本文介绍了一个密码锁解锁问题的解决思路,使用BFS和DP算法找到从初始密码到目标密码所需的最少步骤。
本年度还有8篇博客需要完成
开篇前附加一个看完《盗梦空间》的我的假设
这假设和薛定谔的猫处于半死半活的叠加态感觉有点像


世界全都是我做的梦
1:因为世界中的任何一个人“你”,不能对我证明“你”是有意识的还是只是我的虚构。
2:“你”是有意识还是虚构只能由你自己证明


这是我的某一篇论坛回复
原题是hdu的1195;题目是英文的,大意我翻译一下。

有一个紧急开启密码锁的任务。密码由四位数字组成;每个数字从1到9;每次,可以对每一个数字进行加1或者减1;当从1加到9时,由9再加1会变为1;当从9减到1时,由1再减1会变为9;也可以交换两个相邻的数字,每次操作作为一个step

你的任务就是用最少的步骤解锁
附加:最左边的数字与最右边的数字不相邻
示例输入

1234 2144
1111 9999

示例输出
2
4



分析
首先考虑1234的下一step有可能是什么样的数字
针对每一位数字有四种操作,+1,-1,左交换,右交换(最左边的数字只有右交换,最右边只有左交换)
那么下一step的数字
第一数字位:2234,9234,2134
第二数字位:1334,1134,2134,1324
第三数字位:1244,1224,1324,1243
第四数字位:1235,1233,1243

得到下一step的所有数字,是一个明显的BFS过程。

得到最少的步数,是一个明显的DP过程。也就是STEP(n)=STEP(n-1)+1
STEP(1)=0,题中的STEP(1)就是源数字。
由此需要建立一个长度为10000的数字数组。储存从1111~9999所需要的最小步数

综上所述,代码如下




import java.util.Scanner;

public class Main {

public int openLock(int source, int target) {

int[] minumSteps = new int[10000];
boolean[] visibility = new boolean[10000];

int[] queue = new int[10000];
int index = 0;
queue[0] = source;
visibility[source] = true;
int size = 1;
while (queue[index] != 0) {
int temp = queue[index];
int[] tempAry = getAryFromInt(temp);
index++;

for (int i = 0; i < tempAry.length; i++) {
int[] steps = getNextStep(temp, i);
for (int j = 0; j < steps.length; j++) {
if (!visibility[steps[j]]) {
visibility[steps[j]] = true;
minumSteps[steps[j]] = minumSteps[temp] + 1;
queue[size++] = steps[j];
}
}
}
}
return minumSteps[target];
}

public int[] getNextStep(int ary, int index) {
int[] result = new int[4];
int i = 0;
result[i++] = add(ary, index);
result[i++] = minus(ary, index);
result[i++] = exchangeRight(ary, index);
result[i++] = exchangeLeft(ary, index);
return result;
}

public int getIntFromAry(int[] ary) {
return ary[0] * 1000 + ary[1] * 100 + ary[2] * 10 + ary[3];
}

public int[] getAryFromInt(int num) {
int[] result = new int[4];
result[0] = num / 1000;
result[1] = (num % 1000) / 100;
result[2] = (num % 100) / 10;
result[3] = num % 10;
return result;
}

public int add(int ary, int index) {
int[] result = getAryFromInt(ary);
if (result[index] == 9) {
result[index] = 1;
} else {
result[index] = result[index] + 1;
}
return getIntFromAry(result);
}

public int minus(int ary, int index) {
int[] result = getAryFromInt(ary);
if (result[index] == 1) {
result[index] = 9;
} else {
result[index] = result[index] - 1;
}
return getIntFromAry(result);
}

public int exchangeRight(int ary, int index) {
int[] result = getAryFromInt(ary);
if (index == 3) {
return getIntFromAry(result);
}
int temp = result[index];
result[index] = result[index + 1];
result[index + 1] = temp;
return getIntFromAry(result);
}

public int exchangeLeft(int ary, int index) {
int[] result = getAryFromInt(ary);
if (index == 0) {
return getIntFromAry(result);
}
int temp = result[index];
result[index] = result[index - 1];
result[index - 1] = temp;
return getIntFromAry(result);
}

public static void main(String[] args) {

Main lock = new Main();
Scanner cin = new Scanner(System.in);

int length = cin.nextInt();
int[][] keyvalue = new int[length][2];
for (int i = 0; i < length; i++) {
int key = cin.nextInt();
int value = cin.nextInt();
keyvalue[i] = new int[] { key, value };
}
for (int i = 0; i < keyvalue.length; i++) {
int step = lock.openLock(keyvalue[i][0], keyvalue[i][1]);
System.out.println(step);
}
}

}


翻了翻Accepted列表,到目前为止我是唯一一个用java语言Accepted的。。。。。深囧
附图,脑残G++编译错误的也截了
[img]http://dl.iteye.com/upload/attachment/298276/8e514a9f-daeb-3603-8203-d1be92d0acee.jpg[/img]
潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值