2022-02-15:扫地机器人。
房间(用格栅表示)中有一个扫地机器人。
格栅中的每一个格子有空和障碍物两种可能。
扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。
当扫地机器人试图进入障碍物格子时,它的碰撞传感器会探测出障碍物,使它停留在原地。
请利用提供的4个API编写让机器人清理整个房间的算法。
interface Robot {
// 若下一个方格为空,则返回true,并移动至该方格
// 若下一个方格为障碍物,则返回false,并停留在原地
boolean move();

// 在调用turnLeft/turnRight后机器人会停留在原位置
// 每次转弯90度
void turnLeft();
void turnRight();

// 清理所在方格
void clean();
}
输入:
room = [
[1,1,1,1,1,0,1,1],
[1,1,1,1,1,0,1,1],
[1,0,1,1,1,1,1,1],
[0,0,0,1,0,0,0,0],
[1,1,1,1,1,1,1,1]
],
row = 1,
col = 3

解析:
房间格栅用0或1填充。0表示障碍物,1表示可以通过。
机器人从row=1,col=3的初始位置出发。在左上角的一行以下,三列以右。

注意:
输入只用于初始化房间和机器人的位置。你需要“盲解”这个问题。
换而言之,你必须在对房间和机器人位置一无所知的情况下,只使用4个给出的API解决问题。
扫地机器人的初始位置一定是空地。
扫地机器人的初始方向向上。
所有可抵达的格子都是相连的,亦即所有标记为1的格子机器人都可以抵达。
可以假定格栅的四周都被墙包围。
力扣489。

答案2022-02-15:

map记录走过的路。
0上,1右,2下,3左。
递归。

代码用golang编写。代码如下:

package main

import "strconv"

func main() {

}

// 不要提交这个接口的内容
type Robot interface {
move() bool turnLeft() turnRight() clean()
} // 提交下面的内容
func cleanRoom(robot Robot) {
clean(robot, 0, 0, 0, make(map[string]struct{}))
} var ds = [][]int{{-1, 0}, {0, 1}, {1, 0}, {0, -1}} // 机器人robot,
// 当前来到的位置(x,y),且之前没来过
// 机器人脸冲什么方向d,0 1 2 3
// visited里记录了机器人走过哪些位置
// 函数的功能:不要重复走visited里面的位置,把剩下的位置,都打扫干净!
// 而且要回去!
func clean(robot Robot, x, y, d int, visited map[string]struct{}) {
robot.clean()
visited[strconv.Itoa(x)+"_"+strconv.Itoa(y)] = struct{}{}
for i := 0; i < 4; i++ {
// d = 0 : 0 1 2 3
// d = 1 : 1 2 3 0
// d = 2 : 2 3 0 1
// d = 3 : 3 0 1 2
// 下一步的方向!
nd := (i + d) % 4
// 当下一步的方向定了!下一步的位置在哪?(nx, ny)
nx := ds[nd][0] + x
ny := ds[nd][1] + y
_, ok := visited[strconv.Itoa(nx)+"_"+strconv.Itoa(ny)]
if !ok && robot.move() {
clean(robot, nx, ny, nd, visited)
}
robot.turnRight()
}
// 负责回去:之前的位置,怎么到你的!你要回去,而且方向和到你之前,要一致!
robot.turnRight()
robot.turnRight()
robot.move()
robot.turnRight()
robot.turnRight()
}

左神java代码

2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机的更多相关文章

  1. 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)

    声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...

  2. 2022.02.27 CF811E Vladik and Entertaining Flags

    2022.02.27 CF811E Vladik and Entertaining Flags https://www.luogu.com.cn/problem/CF811E Step 1 题意 在一 ...

  3. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  4. 【Python】将4*4数组旋转90度新数组

    需求:将一个4*4的数组90度旋转生成新的4*4数组 原来的4*4数组:[0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3]90度旋转后的4*4数组:[0, ...

  5. python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  6. Java 处理 iphone拍照后 图片EXIF属性翻转90度的方法

    http://blog.csdn.net/z69183787/article/details/50320821 Java获取照片EXIF信息 http://blog.csdn.net/ghsau/ar ...

  7. 不占用额外内存空间能否做到 将图像旋转90度 N &#215; N矩阵表示的图像,其中每个像素的大小为4字节

    给定一幅由N × N矩阵表示的图像,其中每个像素的大小为4字节,编写一种方法,将图像旋转90度. 不占用额外内存空间能否做到? 示例 1: 给定 matrix = [ [1,2,3], [4,5,6] ...

  8. 2022.02.21 SA

    2022.02.21 SA 当我年少轻狂时,我曾拥有自由,但我并不明白它的意义.我曾拥有时间,但我没有意识到它的珍贵.我曾拥有爱,但我从未用心去体会.数十年的时间考验后,我终于理解了三者的真谛. 我已 ...

  9. 2022.02.20 SA

    2022.02.20 SA 如果我还能看见明天黎明,如果我还能再爬起来,我仍会走我的路,哪怕这条路已经荒废许久,也许我们无法拥有感情,我们甚至无法像个正常人一样接受太阳的洗礼,但是我依然会执行我的条约 ...

  10. 关于android中调用系统拍照,返回图片是旋转90度

    转载博客:http://blog.csdn.net/walker02/article/details/8211628 项目开发中遇到的一个问题,对于三星手机在做手机照片选择时出现图片显示不正常,研究后 ...

随机推荐

  1. mongodb展开数组数据

    核心是$unwind操作 db.getCollection("orders").aggregate([{$unwind:"$OrderTrackingDetails&qu ...

  2. windows2003 的安装以及安装时遇到的问题

    windows2003 的安装以及安装时遇到的问题 简介:Windows Server 2003是微软于2003年3月28日发布的基于Windows XP/NT5.1开发的服务器操作系统,并在同年4月 ...

  3. Python爬虫基础教程2

    beautifulsoup4介绍/遍历文档树 bs4 > 从html或xml文件中提取的python库 用它来解析爬取回来的xml 安装:pip install beautifulsoup4 p ...

  4. 深入理解 python 虚拟机:令人拍案叫绝的字节码设计

    深入理解 python 虚拟机:令人拍案叫绝的字节码设计 在本篇文章当中主要给大家介绍 cpython 虚拟机对于字节码的设计以及在调试过程当中一个比较重要的字段 co_lnotab 的设计原理! p ...

  5. 投资组合计算分析——R语言

    "投资组合"是指金融资产(如股票.债券和现金)的任何组合.投资组合有很多类型,包括市场投资组合和零投资投资组合.可以使用以下任何一种投资方法和原则来管理投资组合的资产分配:股息加权 ...

  6. [Linux]监控外部用户登录及外部主机连接情况

    1 外部用户/外部主机 /var/log 在CentOS系统上,用户登录历史存储在以下这些文件中: /var/log/wtmp 用于存储系统连接历史记录被last工具用来记录最后登录的用户的列表 /v ...

  7. [Linux]CPU架构/指令集:RISC / CISC | arm | amd | X86/i386 | aarch64

    1 前言 本文是解决在软件开发.软件交付过程中,常常需要找寻与服务器硬件的CPU架构适配的软件包时,开发者和交付者又时常摸不着头脑.[迷迷糊糊]地就下载了某个所谓"适配".&quo ...

  8. Semantic Kernel 入门系列:💾Native Function

    语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...

  9. Linux搭建docker

    ### 1. 查看系统的内核版本 ```bash[root@wide ~]# uname -r3.10.0-1160.el7.x86_64``` ### 2. 将yum更新到最新版本 ```bash[ ...

  10. 【LeetCode】232.使用栈模拟队列

    使用栈模拟队列 ​ 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty):实现 MyQueue 类: void push(int x) 将元素 ...