Questions tagged «path-finding»

几何或图形理论中的问题,涉及受约束(障碍)影响的最佳路径(例如最短路径)。

1
保持旅行愉快!
挑战 我在Marks and Spencers周围走来走去,发现他们在商店周围随机放置了空调。为了保持凉爽,我想知道在不离开空调装置太长时间的情况下在整个商店中移动的最简单方法是什么。 在给定地图的情况下,您必须找到一种在整个地图上行驶的方法,以保持与空调单元的距离尽可能短(即使AC单元位于墙壁的另一侧)。 地图 该地图可以按照您喜欢的任何方式提供,并使用以下符号: + is a corner of a wall | is a east/west facing wall - is a north/south facing wall X is an air conditioning unit S is the start and end point 映射示例为: +------S---+ | X | | ---+-+ X | | |X| …

3
生成流氓地图
今天,我们将为Roguelike RPG生成地图! 示例图: ########## #### F# #### ## ## C#C# # ## # # C #E # #### # # # # #P # ########## #是墙壁,P是玩家的起点,F是必须达到的终点,C是可以收集的硬币,E是可以战斗的敌人。 地图规格: 高度和宽度都应在10到39之间(包括10和39)。高度不必等于宽度。 地图边框应填满墙壁。 P 应该放在左下角。 F 应该放在右上角。 应该有1到3个敌人。 应该有2到4个硬币。 中间应该有一些墙。应该有从得到一个路径P的每一个C,E以及F,牢记玩家不能斜走。 每种可能的组合都应有发生的机会。 规则 最低字节程序获胜。 您的程序不应接受任何输入。 您的程序可能不会因错误而退出(非致命输出是STDERR可以的,但是在生成地图后我们无法出现类似流氓的崩溃!) 允许使用单个尾随换行符,并允许尾随空格。 不允许其他输出。

4
手机充电
挑战经我的大学代码挑战竞赛许可 我们对手机的依赖性使我们每天晚上都对手机充电直至达到电池的最大电量,因此,我们不会在第二天的中间出现断电的风险。甚至有些人在白天看到免费的插座时,会对可能发生的事情收取费用。 我是他们其中的一员。 多年以来,我不断完善自己的技术,以使每晚不给电池充电到最大程度。通过众所周知的重复程序,我可以清楚地知道一天中的哪些时间可以进行部分充电(以及电量将增加多少个单位)以及每次充电之间会降低电池电量的原因。利用这些数据,每天晚上我都要计算出第二天必须离开房屋的最低电池电量,以使其永远不会低于我自己设定的两个门槛。 当我离开已建立的例行程序时,我还没有掌握的是相同的计算方法,但我有几种选择可以做事。例如,这发生在我前往另一个可以以不同方式到达的城市的路上。 在解决该问题的第一种方法中,我假设我想绕着“棋盘”从左上角到右下角移动。在每个“小区”中,我可以为移动电话充电一定的金额,或者我不能对其充电,并且其负载水平会下降。 挑战 给定一个整数的FxC矩阵,输出我需要从左上角到右下角的最小电池电量,而负载水平不得低于2个单位。 在矩阵中,正数表示在必须继续沿自己的路径行驶之前我可以为手机充电多少,而负数表示没有插座,并且移动电话的电池电量降低了该数量。确保源单元格和目标单元格中​​的数量(左上角和右下角)始终为0,其余值(绝对值)不超过100。 给定的示例: ⎡⎣⎢⎢⎢📱−1−11−1−1111−1−1−1−1−1−10⎤⎦⎥⎥⎥[📱−11−1−1−1−1−1−11−1−111−10] \begin{bmatrix} 📱&-1&1&-1 \\ -1&-1&-1&-1 \\ -1&1&-1&-1 \\ 1&1&-1&0 \end{bmatrix} 我需要更少电池的路径是: ⎡⎣⎢⎢⎢📱− 1− 11个− 1− 11个1个1个− 1− 1− 1− 1− 1− 10⎤⎦⎥⎥⎥[📱-1个1个-1个-1个-1个-1个-1个-1个1个-1个-1个1个1个-1个0] \begin{bmatrix} 📱&-1&1&-1 \\ \color{blue}{-1}&-1&-1&-1 \\ \color{blue}{-1}&1&-1&-1 \\ \color{blue}{1}&\color{blue}{1}&\color{blue}{-1}&0 \end{bmatrix} 我需要的最小电池电量是4 笔记 起点总是在左上角 终点总是在右下角 您无法进入已通过的单元。示例:位置(0,1)后,您将无法到达起始点(0,0) 您的电池电量不能(出于任何原因)低于2 您可以假设总会有起点和终点 如果需要,可以将一维数组作为多维数组 [1,2,3] …

7
构造雅可比矩阵
取未知向量,并应用一些通用的微分函数。的雅可比然后通过矩阵给出,使得: 例如,假设m=3和n=2。然后(使用基于0的索引) 雅可比f然后 这个挑战的目标是打印这个雅可比矩阵。 输入值 你的程序/功能应该采取作为输入两个正整数m和n,其代表的部件的数目f和u分别。输入可以来自任何所需的来源(stdio,功能参数等)。您可以指定接收顺序,对于输入的答案必须一致(请在答案中指定)。 输出量 代表雅可比矩阵的东西。此表示形式必须明确拼出Jacobian矩阵的所有元素,但是每个术语的确切形式都是实现定义的,只要明确区分什么以及关于什么进行区分,并且每个条目均以逻辑顺序输出。用于表示矩阵的示例可接受形式: 列表列表,其中外部列表​​的每个条目都对应于雅可比行的一行,内部列表的每个条目都对应于雅可比行的列。 字符串或文本输出,其中每行是Jacobian行,每行中由定界符分隔的条目对应于jacobian的列。 矩阵的一些图形/视觉表示。示例:使用MatrixForm命令时Mathematica显示的内容 其他每个条目都已存储在内存中并且可以查询的密集矩阵对象(即,您不能使用生成器对象)。例如,Mathematica如何在内部表示Matrix对象 条目格式示例: 形式为的字符串d f_i/d u_j,其中i和j是整数。例如:d f_1/d u_2。请注意,d和f_1或之间的这些空格x_2是可选的。此外,下划线也是可选的。 形式为d f_i(u_1,...,u_n)/d u_j或的字符串d f_i(u)/d u_j。也就是说,功能组件的输入参数f_i是可选的,并且可以明确地拼写出来或以紧凑形式保留。 格式化的图形输出。例如:计算表达式时Mathematica会打印什么D[f_1[u_,u_2,...,u_n],u_1] 您可以选择起始索引u和目标索引f(请在答案中指定)。输出可以是任何所需的接收器(stdio,返回值,输出参数等)。 测试用例 以下测试用例使用约定m,n。索引显示为从0开始。 1,1 [[d f0/d u0]] 2,1 [[d f0/d u0], [d f1/d u0]] 2 2 [[d f0/d u0, d f0/d u1], [d f1/d u0, d …

2
保卫自己的生命!
让我们一起踢吧! 尽管Moogie是当前的获胜者,但如果有人能获得他的桂冠,他们会被鼓励这样做 踢罐子是一种儿童游戏。涉及一名防御者和多名攻击者。今天不再是这样的游戏!您的工作是写一个机器人玩这个游戏,赢得胜利,成为王道! https://en.wikipedia.org/wiki/Kick_the_can 此游戏有一些主要区别。第一个关键区别是游戏是多人游戏(5v5)。第二个主要区别是,这两种机器人都可以使用地雷和投掷炸弹杀死并消灭敌方玩家!机器人看不到任何地雷(无论距离有多远)或距离超过五个街区的玩家! 该地图如下所示是一个迷宫。 该迷宫在程序上是通过首先使用深度优先递归回溯算法创建一个迷宫来生成的。然后将显示的孔放进去(并使迷宫变得更“不完美”。迷宫的宽度为65x65块,索引为零。因此,蓝色标记(can)为1,1,红色标记(can)为以63,63产生。蓝队以2,2和3,3 4,4等产生,红队以62,62和61,61、60,60等产生。青色方块是蓝队的机器人,并且洋红色中的方块是红色的bot。游戏始终是5比5。团队中的每个bot都会使用您的代码(但可以存储其他实例变量(或创建本地文件)来跟踪状态并区分角色。 游戏玩法 地雷可以放置为灰色。炸弹最多可以扔四个距离。这些武器穿过墙壁和其他玩家最多可移动四个街区,只会杀死阻碍您前进的敌人。每走一步,他们就有40%的机会掉下来。因此,他们有100%的机会在1个射程60%在2个射程36%在3个射程以及21.6%在3个射程放置地雷或投掷炸弹需要一支团队弹药。它从0开始,可以通过收集橙色框来增加。请注意,这些弹药缓存中的四(4)个将方便地居中。机器人按两个红色和两个蓝色排列。IERRRRBBBBB。允许对标志进行修饰,但是要注意,靠近标志(即少于五个块)会导致速度变慢,并且仅允许移动。每三转。竞技场每回合都会随机选择一个启动器。一世。 目的 对五个机器人(每个机器人具有相同的类文件)进行编程,以成功在迷宫中导航并触摸相对的罐子,同时注意不要意外撞倒自己的罐子或踩到地雷。 程式设计 竞技场和漫游器条目当前使用Java,但是存在其他语言的stdin / out包装器。 竞技场代码将可用,但是这里是相关的详细信息。 机器人课 public class YourUniqueBotName extends Bot{ public YourUniqueBotName(int x , int y, int team){ super(x,y,team); //optional code } public Move move(){//todo implement this method //it should output a Move(); //A move has two …

3
取得电话号码的方法
鉴于第一个数字的输入,第二个数字(均为正整数,零已排除),确定有多少种方法可以使第二列全国第一,使用以下操作:+1,+2和*3。简单地从左到右应用操作。 例子: 输入:1 2。输出:1。即,您只能2这样做+1,所以是一种方法。 输入:1 3。输出:3。也就是说,你可以得到由要么做3 +2或+1+1,或*3 输入:1 4。输出:4。 输入:2 6。输出:6。 输入:2 7。输出:9。 输入:1 10。输出:84。 如果没有办法,例如100 100或100 80,输出为0。 您也可以将输入作为数组或带有任何方便分隔符的字符串。 最短的解决方案获胜。

1
自动驾驶模式
从左上角开始的直升飞机正在降落(出于这个问题的目的,在2D空间中)朝地面。它具有自动驾驶模式和手动模式。 自动驾驶模式的行为如下: 如果正下方的空间是可用的,则下降至该位置。 否则,完全随机地向左或向右移动一步。(它可以以此方式移动多个步骤。) 并且它会不断重复这两个步骤,直到它落地。手动模式更加智能,即使在需要向上移动或进行一些熟练操作的情况下,也会找到通往地面的最佳路径。 您的工作是确定 自动驾驶仪将在给定情况下通过, 在特定情况下,自动驾驶仪可能会失败, 自动驾驶仪将失败,但是手动模式将通过,或者 两种模式都将失败(没有有效的接地路径)。 输入值 给定场景为1d或2d非空数组,使用两个不同的字符表示自由空间和受阻空间。标点符号是可选的。 可选:数组的尺寸 输出量 四个预定义字符之一,指示发生了哪种情况。 样本数据 在输入中使用0(空)和1(阻止),在输出中使用1 2 3 4(如上编号) 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 输出: 1 0 0 1 0 1 0 0 1 0 0 0 0 …

2
破解保险柜!
受/puzzling/24334/to-catch-a-thief的启发 将为您提供一个n由s和s(或您选择的任何其他字符)填充的by n(n本身是可选输入)网格。您的目标是使每个单元格相同(或)。您可以按照以下定义进行一系列移动(注意与“ Puzzling SE”链接有所不同):0101 选择一个单元格。 同一行和同一列中的每个单元格(单元格本身除外)都变为相反。0到1和1到0。 输出完成任务所需的最少移动次数。如果无法解决,则输出除非负整数以外的任何内容。最短的代码获胜。 样本数据 1 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 …

7
本周四年级数学作业:效率最低的旅行推销员
我女儿的数学作业有以下任务。想象一下,有六个朋友生活在一条名为E,F,G,H,J和K的直线上。他们在直线上的位置如下所示(未按比例): 因此,F从E居住五个单元,从G居住两个单元,依此类推。 您的作业:设计一个程序,该程序以朋友的位置和n为输入,以总长度n个单位的长度来精确地访问每个朋友一次。如果找到它,它应该报告该路径(例如,对于长度17,它可能报告“ E,F,G,H,J,K”,并且如果不存在任何解决方案,则应正常退出。对于它的价值,我完成了Mathematica中271个字节的非解决方案,我怀疑这可能比这更简洁。

2
机器人!收集这些泡菜!
我似乎有点不高兴。从字面上看。我把一堆泡菜放在地板上,现在它们都散落了!我需要你来帮助我收集它们。哦,我是否提到我要指挥一堆机器人?(它们也分散在各处;我真的很难组织事情。) 您必须以以下形式输入: P....... ..1..2.. .......P ........ P3PP...4 .......P 即,多行.,P(点名)或数字(机器人的ID)。(您可以假设每行的长度相等,并用.。填充。)您可以将这些行作为数组输入,或者从STDIN中吸取,或者读取以逗号分隔的单行,或者读取文件,或者执行任何操作喜欢接受输入。 您的输出必须采用n行的形式,其中n是最高的机械手ID。(机器人ID始终从1开始是连续的。)每行将包含由字母L(左),R(右),U(上)和D(下)组成的机器人路径。例如,这是该难题的示例输出: LLU RDR LRRR D 也可以是 LLU RDR LRRR D 要么 ["LLU","RDR","LRRR","D"] 或任何您想要的格式,只要您能说出解决方案应该是什么即可。 您的目标是找到最佳输出,这是步骤最少的输出。步数被视为所有机器人的最大步数。例如,上面的示例包含4个步骤。请注意,可能有多种解决方案,但是您只需要输出一种即可。 得分: 您的程序将与5个(随机生成的)测试用例一起运行。 您必须添加每次运行的步骤,这就是您的分数。 最低的累计分数将获胜。 您可能没有为这些特定输入进行硬编码。您的代码也应适用于任何其他输入。 机器人可以相互穿过。 您的程序必须是确定性的,即每次运行都具有相同的输出。您可以使用随机数生成器,只要它是种子并且可以跨平台一致地生成相同的数字即可。 每个输入的代码必须在3分钟内运行。(最好少得多。) 如果平局,大多数投票将获胜。 这是测试用例。它们是用我写的一个小的Ruby脚本随机生成的。 P.......1. .......... P.....P... ..P....... ....P2.... ...P.P.... .PP..P.... ....P....P PPPP....3. .P..P.P..P ....P..... P....1.... .P.....PP. .PP....PP. .2.P.P.... ..P....P.. .P........ …

1
具有精确终点和零终端速度的赛道变化
介绍 挑战是游戏赛道和这两个挑战的非常有趣的变体: 要Vectory!–矢量赛车大奖赛 编写赛车程序 挑战的根源在这里(德语):c't-Racetrack 这个挑战特别有趣(并且不同于上述两个挑战),因为它结合了巨大的搜索空间以及必须满足的一些确切条件。由于巨大的搜索空间,穷举搜索技术难以使用,由于确切的条件,近似方法也不易使用。由于这种独特的结合(加上物理学的基本直觉),这个问题令人着迷(无论如何,与赛车有关的一切都令人着迷;-) 挑战 请看以下赛马场(源代码): 您必须从头开始(120,180)并精确地完成操作(320,220)(德语为“ Ziel”),而无需碰触其中一堵墙。 汽车受以下形式的加速度矢量控制(a_x,a_y)-例如: (8,-6) (10,0) (1,9) 第一个数字是x向量的加速度,第二个数字是y向量的加速度。它们必须是整数,因为只允许使用网格上的整数点。此外,还必须满足以下条件: a_x^2 + a_y^2 <= 100, 这意味着在任何方向上的加速度都必须低于或等于10。 要查看其工作原理,请查看以下图片(源): 例如:从(120,180)您开始8以x方向和-6y方向加速。对于下一步,这是您的速度,您可以在其中添加加速度(10,0)以获得(物理上正确的)下一个合成运动(指向)(146,168)。合成运动是检查您是否触摸过其中一堵墙的关键。再次将下一个加速度矢量添加到当前速度以得到下一个运动,依此类推。因此,您的汽车在每一步都有一个位置和一个速度。(在上面的说明图中,蓝色箭头表示速度,橙色箭头表示表示加速,深红色箭头表示最终的运动。) 作为附加条件,在(0,0)终点时必须具有最终速度(320,220)。 输出必须是上述形式的加速度矢量列表。 获奖者是提供程序的人,该程序可以找到加速度矢量最少的解决方案。 Tiebreaker 另外,如果您可以证明这是一个最佳解决方案,以及这是否是唯一的最佳解决方案或是否有多个最佳解决方案(以及它们是哪种),那将是非常不错的。 如果您可以大致概述算法的工作原理并注释代码,以使我们能够理解它,那也很好。 我有一个程序可以检查任何给定的解决方案是否有效,我会给出反馈。 附录 您可以使用任何编程语言,但是如果有人使用R,我会特别高兴,因为我在日常工作中经常使用R,并且以某种方式习惯了它:-) 附录II 我第一次开始赏金计划-希望这可以使球滚动(或者更好:让汽车行驶:-)

2
下坡迷宫求解器
下坡迷宫由一系列由0到9(含0)到9(含)之间的数字分隔的行组成,外加一个“ S”和一个“ X”,其中S表示起点,X表示终点。在下坡迷宫中,您只能进入北,南,东或西与您相邻的空间(无对角线),并且只能进入小于或等于您的值的空间目前处于开启状态。 程序应以与输入相同的格式输出路径,以在迷宫中导航,只有所有经过的空格都应带有“”。在它们中,所有未访问的空间中都应带有“#”。起始和结束单元格还应分别保留其“ S”和“ X”。您可以假设迷宫总是有解决方案的。 输入示例: 3 3 3 3 2 1 S 8 9 3 1 1 3 3 0 6 8 7 1 2 2 4 3 2 5 9 7 1 2 1 5 4 3 4 4 6 1 1 X 6 4 4 5 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.