题目描述

假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙

输入描述:

迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N

后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。

输出描述:

路径的长度,是一个整数

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;public class Main {static int[][] next={{-1,0},{0,-1},{1,0},{0,1}};public static void main(String[] args) throws IOException {InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String[] mn = String.valueOf(bufferedReader.readLine()).split(" ");int m = Integer.parseInt(mn[0]);int n = Integer.parseInt(mn[1]);String[] tempArray = new String[m];for(Integer i = 0; i < m; i++) {tempArray[i] =  bufferedReader.readLine();}char[][] mnArray = new char[m][n];Integer startX = 0;Integer startY = 0;for(int i = 0; i < m; i++) {if(tempArray[i].contains("2")) {startX = i;startY = tempArray[i].indexOf("2");}mnArray[i] = tempArray[i].toCharArray();}Integer result = step(startX, startY, m, n, mnArray);System.out.println(result);}public static Integer step(Integer x, Integer y, Integer m, Integer n, char[][] mnArray) {Queue<StepNode> stepQueue = new LinkedList<>();stepQueue.offer(new StepNode(x,y,0,0));byte[][][] arrived = new byte[m][n][1024];while(!stepQueue.isEmpty()) {StepNode stepNode = stepQueue.poll();for(int i = 0; i < 4; i++) {int[] nextNode = next[i];int nextX = nextNode[0];int nextY = nextNode[1];int stepX = stepNode.x + nextX;int stepY = stepNode.y + nextY;int step = stepNode.step;int key = stepNode.key;if(stepX < 0 || stepY < 0 || stepX > m - 1 || stepY > n - 1|| mnArray[stepX][stepY] == '0') {continue;}if(mnArray[stepX][stepY] >= 'a' && mnArray[stepX][stepY] <= 'z') {int index = mnArray[stepX][stepY] - 'a';key |= 1 << index;}if(mnArray[stepX][stepY] >= 'A' && mnArray[stepX][stepY] <= 'Z') {int index = mnArray[stepX][stepY] - 'A';if(((key >> index) & 1) == 0) {continue;}}if(mnArray[stepX][stepY] == '3') {return step + 1;}if(arrived[stepX][stepY][key] == 0) {arrived[stepX][stepY][key] = 1;stepQueue.offer(new StepNode(stepX, stepY, step + 1, key));}}}return  -1;}class StepNode {int x;int y;int step;int key;public StepNode(int x, int y, int step, int key) {this.x = x;this.y = y;this.step = step;this.key = key;}}
}

题目描述

六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能将多块巧克力分给一个孩子或将一块分给多个孩子。

输入描述:

第一行:n,表示h数组元素个数
 第二行:n个h数组元素
 第三行:m,表示w数组元素个数
 第四行:m个w数组元素

输出描述:

上台表演学生人数

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;public class Main {public static void main(String[] args) throws IOException {Integer result = 0;InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);Integer n = Integer.valueOf(bufferedReader.readLine());String[] h = String.valueOf(bufferedReader.readLine()).split(" ");Integer[] hArray = new Integer[n];for (int i = 0; i < h.length; i++) {hArray[i] = Integer.valueOf(h[i]);}Integer m = Integer.valueOf(bufferedReader.readLine());String[] w = String.valueOf(bufferedReader.readLine()).split(" ");Integer[] wArray = new Integer[m];for (int i = 0; i < w.length; i++) {wArray[i] = Integer.valueOf(w[i]);}Arrays.sort(hArray);Arrays.sort(wArray);Integer now = 0;end:for (Integer chw : wArray) {for (int index = now; index < n; index++) {if (hArray[index] <= chw) {result++;now = index + 1;break;}if (index == n) {break end;}}}System.out.println(result);}}

题目描述

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;public class Main {public static void main(String[] args) throws IOException {InputStreamReader inputStreamReader = new InputStreamReader(System.in);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);int number =  Integer.valueOf(bufferedReader.readLine());String[] str = bufferedReader.readLine().split(" ");int[] array = new int[str.length];for (int i = 0; i < array.length; i++) {array[i] = Integer.parseInt(str[i]);}if (array.length == 3) {System.out.println(array[0] * array[1] * array[2]);return;}ArrayList<Integer> plus = new ArrayList(array.length);ArrayList<Integer> minus = new ArrayList(array.length);for (Integer member : array) {if (member == 0) {continue;}if (member < 0) {int index = 0;for (; index < minus.size(); index++) {if (Math.abs(minus.get(index)) < Math.abs(member)) {Integer temp = minus.get(index);minus.set(index, member);member = temp;}}minus.add(member);} else {int index = 0;for (; index < plus.size(); index++) {if (Math.abs(plus.get(index)) < Math.abs(member)) {Integer temp = plus.get(index);plus.set(index, member);member = temp;}}plus.add(member);}}Long result = null;if (plus.size() >= 3) {result = Long.valueOf(plus.get(0)) * plus.get(1) * plus.get(2);}if (plus.size() >= 1 && minus.size() >= 2) {if (result == null) {result = Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0);} else {result =  Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0) > result ?  Long.valueOf(minus.get(0)) * minus.get(1) * plus.get(0) : result;}}if (result == null) {result = 0L;}System.out.println(result);return;}}

算法题存档20190127相关推荐

  1. 算法题存档20200505

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  2. 算法题存档20191223

    题目描述 删除给出链表中的重复元素,使链表中的所有元素都只出现一次 例如: 给出的链表为1->1->2,返回1->2. 给出的链表为1->1->2->3->3 ...

  3. 算法题存档20190207

    题目描述 如果一个整数只能被1和自己整除,就称这个数是素数. 如果一个数正着反着都是一样,就称为这个数是回文数.例如:6, 66, 606, 6666 如果一个数字既是素数也是回文数,就称这个数是回文 ...

  4. 算法题存档20200627(树)

    给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表. 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 Tru ...

  5. 算法题存档2020425

    给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [   [1,2,3],   [1,3,2],   [2,1,3],   [2,3,1],   [3, ...

  6. 20191219算法题存档

    题目描述 给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组 注意: 可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n public class ...

  7. 20190730算法题存档

    题目描述 Given a singly linked list L: L 0→L 1→-→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→ ...

  8. 20190724算法题存档

    题目描述 Sort a linked list in O(n log n) time using constant space complexity. public class Solution {p ...

  9. 20190719算法题存档

    题目描述 小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011.... 并且小Q对于能否被3整除这个性质很感兴趣. 小Q现在希望你能帮他计算一下从数 ...

最新文章

  1. 网络工程师_记录的一些真题_2005上半年上午
  2. 字符串(string类)
  3. 科普云计算知识,迎接云计算大会
  4. 定义一个不能被拷贝的类
  5. IT 语音 java hi_Java bithift陌生
  6. 33个非常有创意的404错误页面设计
  7. 【Java自顶向下】面试官:HashMap源码看过吗?我:看过!面试官:好极了,那么来扒一扒吧!
  8. 深入理解C++类的构造函数与析构函数
  9. 安卓入门系列-06常见布局之ConstraintLayout(约束布局)
  10. C++的一般引用及其数组引用
  11. dubbo协议_Dubbo框架支持多少种协议?各有什么特点?文中一一为你揭晓
  12. python将h264文件视频转为mp4格式
  13. Rockchip RK3288 Datasheet芯片手册资料
  14. SVN更新报the working copy needs to be upgraded解决办法
  15. 笔记本电脑计算机无法显示u盘,笔记本不识别u盘怎么办_笔记本电脑不读U盘如何解决-win7之家...
  16. 三种数据库的 SQL 注入详解
  17. 佛罗里达大学计算机科学专业排名,2019年南佛罗里达大学计算机科学专业排名情况如何?...
  18. java接口 运动员,JAVA面向对象进阶实例【教练和运动员日常安排】
  19. 利用Origin绘制等高线颜色填充图:初步绘制与细化
  20. 传说中让理科生沉默,让文科生落泪的文史综合题

热门文章

  1. Spring框架中IoC(控制反转)的原理
  2. null对象访问static属性或方法
  3. dos命令行设置网络优先级_网络安全之木马病毒的防范以及攻击
  4. C# OpenTK教程 - 1.1 创建窗口
  5. C#内将DataSet分页
  6. html5邀请函在线制作,很炫的html5年会邀请函
  7. 泽尼克多项式 matlab,zernike多项式 ---matlab程序 ---arrayfun.m函数
  8. PHP利用PDO从mysql读取大量数据处理(可做大量数据集的导出,业务调整等)
  9. 在 eclipse 中设置每行的字数
  10. 专题实验 字符集(全球化支持)