本年度还有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++编译错误的也截了
分享到:
相关推荐
【ACM/ICPC 入门详解】 ACM/ICPC(国际大学生程序设计竞赛/国际编程竞赛)是一项全球性的编程比赛,旨在培养大学生的算法设计、问题解决和团队合作能力。初学者若想踏入这个领域,首先要了解基础的编程知识和如何在...
《ACM/ICPC在线评测系统解题报告详解》 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)和ICPC(国际程序设计竞赛)是全球范围内极具影响力的计算机编程竞赛,旨在培养大学生的算法...
杭州电子科技大学(HDU)的ACM代表队,即HDU-ACM,自2003年开始参赛,并逐年积累经验,通过校内选拔赛和集训培养优秀的队员,参与各类区域和国际赛事,提升学生在ACM竞赛中的表现。 总的来说,ACM/ICPC不仅是对参赛...
算法分析与设计-大型实验报告样本 五、参考资源 在网络上有很多论坛,欢迎大家参考。著名的有: ...杭州电子科技大学在线题库:http://acm.hdu.edu.cn/ 浙江师范大学ACM/ICPC论坛:http://acm.zjnu.cn/
《ACM HDU 2000-2099 解题报告 杭电 ACM》是一份详尽的编程竞赛解题集,主要涵盖了杭电(Hangzhou Dianzi University)在线判题系统(HDU OJ)上的2000至2099号题目。这份解题报告是针对参与ACM/ICPC(国际大学生...
1. poj与hdu:这两个缩写分别代表了Problemset Online Judge(POJ)和Hangzhou Dianzi University Online Judge(HDU),是两个著名的在线编程竞赛平台,用于训练和测试ACM/ICPC参赛者的编程和算法能力。它们提供了...
- **UVA OJ** (`http://acmicpc-live-archive.uva.es/nuevoportal/continent.php?c=as`):收录了部分历年的区域赛题目。 #### 三、常用集成开发环境(IDE) 在ACM/ICPC竞赛中,选择合适的集成开发环境对于提升编程...
【标题】"hdu acm 2010多校联合(10)1009" 是2010年ACM/ICPC(国际大学生程序设计竞赛)多校联合比赛的第十场比赛中的一道题目,编号为1009。这道题目涉及到算法竞赛中的常见问题解决策略,通常在这样的比赛中,...
【ACM入门PPT教程】是一份针对ACM国际大学生程序设计竞赛的入门指导材料,旨在帮助初学者了解ACM/ICPC竞赛的基本情况、参赛原则、涉及的算法和学习方法,以及如何通过国内知名的在线评测网站进行练习。ACM国际大学生...
而ACM国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC)是由ACM主办的一项全球性的竞赛,始于1977年,旨在检验大学生在分析问题和解决问题上的能力,为未来的IT专业人士提供实践...
【杭电ACM部分答案】涉及的是编程竞赛领域的一个专项训练,主要针对的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)所举办的ACM/ICPC(国际大学生程序设计竞赛)的练习题目。这个压缩包中的内容...
HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...
【标签】的关键词"ACM"代表了国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ICPC或ACM/ICPC),这是一个全球性的编程竞赛,旨在促进计算机科学教育和团队合作精神。"hdu"可能是指...
HDU ACM教案是针对ACM/ICPC(国际大学生程序设计竞赛)的训练教程,旨在帮助参赛者提升算法和编程技能。"搜索入门"这部分内容是教程中的一个重要章节,主要介绍在解决算法问题时如何有效地运用搜索策略。在这个章节...
#### 一、ACM/ICPC简介 虽然本文不会深入介绍ACM/ICPC(国际大学生程序设计竞赛),但对于初次接触的学生来说,简单了解一下这项竞赛的基本概念是非常有帮助的。ACM/ICPC是一项面向全球大学生的编程竞赛,旨在考验...
【杭电ACM题目解答】涉及的是编程竞赛领域中的杭电(Hangzhou Dianzi University)在线判题系统,也称为HDU ACM/ICPC Online Judge。这个平台为程序员提供了大量的算法题目,供参赛者练习和提高编程技能,尤其是算法...
【标题】"hdu4405_HDOJ_ACM_" 指的是在杭州电子科技大学(HDU)的在线判题系统(Online Judge,简称OJ)上的一道编程竞赛题目,它属于HDOJ ACM系列。这个系列通常与国际大学生程序设计竞赛(ACM/ICPC)相关,这类...