刷題(14)489. Robot Room Cleaner

昨天刷到一個(gè)很有意思的題目柳击,489.?Robot Room Cleaner, 是hard題片习,我順便看了下半年內(nèi)的公司選這道題目面試的tag, google facebook這種大廠非常多次捌肴。?

這道題做完就會(huì)想會(huì)不會(huì)家里的掃地機(jī)器人也是這個(gè)算法?你猜你家里的掃地機(jī)器人用的是什么算法呢藕咏?哈哈肯定不是這個(gè)状知。

這個(gè)題目乍一看感覺(jué)有點(diǎn)難,因?yàn)闄C(jī)器人是randomly安排起始點(diǎn)的孽查,但是題目很清楚地表示了用一個(gè)m*n的方格子來(lái)作為maze饥悴,這個(gè)就相當(dāng)于給了很多限制。然后后面還有機(jī)器人到達(dá)一個(gè)方塊的時(shí)候,如何知道是面朝什么方向的呢西设?

這道題的leetcode solution給我們指向了一個(gè)maze algorithm的wiki瓣铣,solution用的就是right-hand rule。這個(gè)就讓思路很清晰了贷揽。另外solution比較tricky的就是仍然用一個(gè)矩陣來(lái)記錄visited node 來(lái)幫助backtrack棠笑。以起始點(diǎn)為原坐標(biāo),構(gòu)建矩陣擒滑。

solution:

class Solution {

? ? int[][] directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

? ? Set<Pair<Integer, Integer>> visited = new HashSet<>();

? ? Robot robot;


? ? private void goback() {

? ? ? ? robot.turnRight();

? ? ? ? robot.turnRight();

? ? ? ? robot.move();

? ? ? ? robot.turnRight();

? ? ? ? robot.turnRight();

? ? }


? ? private void backtrack(int i, int j, int dir) {

? ? ? ? visited.add(new Pair(i, j));

? ? ? ? robot.clean();

? ? ? ? for(int d = 0;d<4;d++) {

? ? ? ? ? ? int del = (dir + d)%4; // 非常好的去解決方向的問(wèn)題

? ? ? ? ? ? int newI = i + directions[del][0];

? ? ? ? ? ? int newJ = j + directions[del][1];


? ? ? ? ? ? if(!visited.contains(new Pair(newI, newJ)) && robot.move()) {

? ? ? ? ? ? ? ? backtrack(newI, newJ, del);

? ? ? ? ? ? ? ? goback();

? ? ? ? ? ? }


? ? ? ? ? ? robot.turnRight();

? ? ? ? }


? ? }


? ? public void cleanRoom(Robot robot) {

? ? ? ? this.robot = robot;

? ? ? ? backtrack(0,0,0);

? ? }

}


time complexity:?O(N?M), where?N is a number of cells in the room and M?is a number of obstacles.

space complexity: O(N-M)

比較接近的一道題:?130.?Surrounded Regions 腐晾, 比較輕松的做法就是原地修改值,然后再改回來(lái)丐一。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藻糖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子库车,更是在濱河造成了極大的恐慌巨柒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠衍,死亡現(xiàn)場(chǎng)離奇詭異洋满,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)珍坊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)牺勾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人阵漏,你說(shuō)我怎么就攤上這事驻民。” “怎么了履怯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵回还,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我叹洲,道長(zhǎng)柠硕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任运提,我火速辦了婚禮蝗柔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘民泵。我一直安慰自己诫咱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布洪灯。 她就那樣靜靜地躺著坎缭,像睡著了一般竟痰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掏呼,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天坏快,我揣著相機(jī)與錄音,去河邊找鬼憎夷。 笑死莽鸿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拾给。 我是一名探鬼主播祥得,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒋得!你這毒婦竟也來(lái)了级及?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤额衙,失蹤者是張志新(化名)和其女友劉穎饮焦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窍侧,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县踢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伟件。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼啤。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斧账,靈堂內(nèi)的尸體忽然破棺而出谴返,到底是詐尸還是另有隱情,我是刑警寧澤其骄,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布亏镰,位于F島的核電站扯旷,受9級(jí)特大地震影響拯爽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钧忽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一毯炮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耸黑,春花似錦桃煎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春葫辐,著一層夾襖步出監(jiān)牢的瞬間搜锰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工耿战, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛋叼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓剂陡,卻偏偏與公主長(zhǎng)得像狈涮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸭栖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容