`
leon_a
  • 浏览: 79017 次
  • 性别: Icon_minigender_1
  • 来自: 拜月神教
社区版块
存档分类
最新评论

ACM/ICPC HDU 1195

阅读更多
本年度还有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++编译错误的也截了
1
0
分享到:
评论

相关推荐

    ACM/ICPC入门详解!!!初学者必看

    【ACM/ICPC 入门详解】 ACM/ICPC(国际大学生程序设计竞赛/国际编程竞赛)是一项全球性的编程比赛,旨在培养大学生的算法设计、问题解决和团队合作能力。初学者若想踏入这个领域,首先要了解基础的编程知识和如何在...

    acm/icpc/onlinejudge试题/解题报告

    《ACM/ICPC在线评测系统解题报告详解》 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)和ICPC(国际程序设计竞赛)是全球范围内极具影响力的计算机编程竞赛,旨在培养大学生的算法...

    (课件1)初识ACM_20070925_simple

    杭州电子科技大学(HDU)的ACM代表队,即HDU-ACM,自2003年开始参赛,并逐年积累经验,通过校内选拔赛和集训培养优秀的队员,参与各类区域和国际赛事,提升学生在ACM竞赛中的表现。 总的来说,ACM/ICPC不仅是对参赛...

    算法分析与设计-大型实验报告样本

    算法分析与设计-大型实验报告样本 五、参考资源 在网络上有很多论坛,欢迎大家参考。著名的有: ...杭州电子科技大学在线题库:http://acm.hdu.edu.cn/ 浙江师范大学ACM/ICPC论坛:http://acm.zjnu.cn/

    ACM HDU 2000-2099 解题报告 杭电 ACM

    《ACM HDU 2000-2099 解题报告 杭电 ACM》是一份详尽的编程竞赛解题集,主要涵盖了杭电(Hangzhou Dianzi University)在线判题系统(HDU OJ)上的2000至2099号题目。这份解题报告是针对参与ACM/ICPC(国际大学生...

    北大杭电acm题解(详细)

    1. poj与hdu:这两个缩写分别代表了Problemset Online Judge(POJ)和Hangzhou Dianzi University Online Judge(HDU),是两个著名的在线编程竞赛平台,用于训练和测试ACM/ICPC参赛者的编程和算法能力。它们提供了...

    ACM10_11赛程&常用网站

    - **UVA OJ** (`http://acmicpc-live-archive.uva.es/nuevoportal/continent.php?c=as`):收录了部分历年的区域赛题目。 #### 三、常用集成开发环境(IDE) 在ACM/ICPC竞赛中,选择合适的集成开发环境对于提升编程...

    hdu acm 2010多校联合(10)1009

    【标题】"hdu acm 2010多校联合(10)1009" 是2010年ACM/ICPC(国际大学生程序设计竞赛)多校联合比赛的第十场比赛中的一道题目,编号为1009。这道题目涉及到算法竞赛中的常见问题解决策略,通常在这样的比赛中,...

    ACM入门PPT教程

    【ACM入门PPT教程】是一份针对ACM国际大学生程序设计竞赛的入门指导材料,旨在帮助初学者了解ACM/ICPC竞赛的基本情况、参赛原则、涉及的算法和学习方法,以及如何通过国内知名的在线评测网站进行练习。ACM国际大学生...

    ACM初识. pdf

    而ACM国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC)是由ACM主办的一项全球性的竞赛,始于1977年,旨在检验大学生在分析问题和解决问题上的能力,为未来的IT专业人士提供实践...

    杭电Acm部分答案

    【杭电ACM部分答案】涉及的是编程竞赛领域的一个专项训练,主要针对的是杭州电子科技大学(Hangzhou Dianzi University,简称“杭电”)所举办的ACM/ICPC(国际大学生程序设计竞赛)的练习题目。这个压缩包中的内容...

    HDU最全ac代码

    HDU(Hangzhou Dianzi University)是国内外知名的在线编程竞赛平台,主要服务于ACM/ICPC(国际大学生程序设计竞赛)以及相关的算法训练。"HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标签】的关键词"ACM"代表了国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ICPC或ACM/ICPC),这是一个全球性的编程竞赛,旨在促进计算机科学教育和团队合作精神。"hdu"可能是指...

    hdu acm 教案(7)

    HDU ACM教案是针对ACM/ICPC(国际大学生程序设计竞赛)的训练教程,旨在帮助参赛者提升算法和编程技能。"搜索入门"这部分内容是教程中的一个重要章节,主要介绍在解决算法问题时如何有效地运用搜索策略。在这个章节...

    ACM入门指南ACM入门指南

    #### 一、ACM/ICPC简介 虽然本文不会深入介绍ACM/ICPC(国际大学生程序设计竞赛),但对于初次接触的学生来说,简单了解一下这项竞赛的基本概念是非常有帮助的。ACM/ICPC是一项面向全球大学生的编程竞赛,旨在考验...

    杭电acm题目解答

    【杭电ACM题目解答】涉及的是编程竞赛领域中的杭电(Hangzhou Dianzi University)在线判题系统,也称为HDU ACM/ICPC Online Judge。这个平台为程序员提供了大量的算法题目,供参赛者练习和提高编程技能,尤其是算法...

    hdu4405_HDOJ_ACM_

    【标题】"hdu4405_HDOJ_ACM_" 指的是在杭州电子科技大学(HDU)的在线判题系统(Online Judge,简称OJ)上的一道编程竞赛题目,它属于HDOJ ACM系列。这个系列通常与国际大学生程序设计竞赛(ACM/ICPC)相关,这类...

Global site tag (gtag.js) - Google Analytics