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程式碼](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class49/Problem_0548_SplitArrayEithEqualSum.java)