<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)489:掃地機(jī)器人

          共 2590字,需瀏覽 6分鐘

           ·

          2022-01-09 20:50

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?掃地機(jī)器人,我們先來看題面:
          https://leetcode-cn.com/problems/robot-room-cleaner/


          示例? ? ? ? ? ? ? ? ? ? ? ? ?


          輸入:
          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
          解析:
          房間格柵用01填充。0表示障礙物,1表示可以通過。
          機(jī)器人從row=1,col=3的初始位置出發(fā)。在左上角的一行以下,三列以右。


          解題

          http://www.javashuo.com/article/p-yvxgcwal-mq.html

          給了咱們一個(gè)掃地機(jī)器人,給了4個(gè) API 函數(shù)可供咱們調(diào)用,具體實(shí)現(xiàn)不用咱們操心,讓咱們實(shí)現(xiàn)打掃房間 cleanRoom 函數(shù)。給的例子中有房間和起始位置的信息,可是代碼中卻沒有,擺明是不想讓咱們被分心。想一想也是,難道咱們?cè)诮o掃地機(jī)器人編程時(shí),還必需要知道用戶的房間信息么?

          固然不可以啦,題目中也說了讓咱們盲目 Blindfolded 一些,因此就盲目的寫吧。既然是掃地,那么確定要記錄哪些位置已經(jīng)掃過了,因此確定要記錄位置信息,因?yàn)椴恢廊治恢?,那么只能用相?duì)位置信息了。初始時(shí)就是 (0, 0),而后上下左右加1減1便可。位置信息就放在一個(gè) HashSet 中就能夠了,同時(shí)為了方便,還能夠?qū)⒍S坐標(biāo)編碼成一個(gè)字符串。

          咱們采用遞歸 DFS 來作,初始化位置為 (0, 0),而后建一個(gè)上下左右的方向數(shù)組,使用一個(gè)變量 dir 來從中取數(shù)。在遞歸函數(shù)中,咱們首先對(duì)起始位置調(diào)用 clean 函數(shù),由于題目中說了起始位置是能到達(dá)的,便是為1的地方。而后就要把起始位置加入 visited。而后咱們循環(huán)四次,由于有四個(gè)方向,因?yàn)檫f歸函數(shù)傳進(jìn)來的 dir 是上一次轉(zhuǎn)到的方向,那么此時(shí)咱們 dir 加上i,為了防止越界,對(duì)4取余,就是咱們新的方向了,而后算出新的位置坐標(biāo) newX 和 newY。此時(shí)先要判斷 visited 不含有這個(gè)新位置,即新位置沒有訪問過,還要調(diào)用 move 函數(shù)來肯定新位置是否能夠到達(dá),若這兩個(gè)條件都知足的話,咱們就對(duì)新位置調(diào)用遞歸函數(shù)。注意遞歸函數(shù)調(diào)用完成后,咱們要回到調(diào)用以前的狀態(tài),由于這里的 robot 是帶了引用號(hào)的,是全局通用的,因此要回到以前的狀態(tài)?;氐揭郧暗臓顟B(tài)很簡(jiǎn)單,由于這里的機(jī)器人的運(yùn)做方式是先轉(zhuǎn)到要前進(jìn)的方向,才能前進(jìn)。那么咱們后退的方法就是,旋轉(zhuǎn) 180 度,前進(jìn)一步,再轉(zhuǎn)回到原來的方向。

          同理,咱們?cè)诎错樞蛟嚿?>右->下->左的時(shí)候,每次機(jī)器人要向右轉(zhuǎn)一下,由于 move 函數(shù)只能探測(cè)前方是否能到達(dá),因此咱們必須讓機(jī)器人轉(zhuǎn)到正確的方向,才能正確的調(diào)用 move 函數(shù)。若是用過掃地機(jī)器人的童鞋應(yīng)該會(huì)有影響,當(dāng)前方有障礙物的時(shí)候,機(jī)器人圓盤會(huì)先轉(zhuǎn)個(gè)方向,而后再繼續(xù)前進(jìn),這里要實(shí)現(xiàn)的機(jī)制也是相似的,參見代碼以下:

          class?Solution?{
          public:
          ????vector<vector<int>> dirs{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
          ????void?cleanRoom(Robot& robot)?{
          ????????unordered_set<string> visited;
          ????????helper(robot, 0, 0, 0, visited);
          ????}
          ????void?helper(Robot& robot, int?x, int?y, int?dir, unordered_set<string>& visited)?{
          ????????robot.clean();
          ????????visited.insert(to_string(x) + "-"?+ to_string(y));
          ????????for?(int?i = 0; i < 4; ++i) {
          ????????????int?cur = (i + dir) % 4, newX = x + dirs[cur][0], newY = y + dirs[cur][1];
          ????????????if?(!visited.count(to_string(newX) + "-"?+ to_string(newY)) && robot.move()) {
          ????????????????helper(robot, newX, newY, cur, visited);
          ????????????????robot.turnRight();
          ????????????????robot.turnRight();
          ????????????????robot.move();
          ????????????????robot.turnLeft();
          ????????????????robot.turnLeft();
          ????????????}
          ????????????robot.turnRight();
          ????????}
          ????}
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-480題匯總,希望對(duì)你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)481:神奇字符串

          LeetCode刷題實(shí)戰(zhàn)482:密鑰格式化

          LeetCode刷題實(shí)戰(zhàn)483:最小好進(jìn)制

          LeetCode刷題實(shí)戰(zhàn)484:尋找排列

          LeetCode刷題實(shí)戰(zhàn)485:最大連續(xù) 1 的個(gè)數(shù)

          LeetCode刷題實(shí)戰(zhàn)486:預(yù)測(cè)贏家

          LeetCode刷題實(shí)戰(zhàn)487:最大連續(xù)1的個(gè)數(shù) II

          LeetCode刷題實(shí)戰(zhàn)488:祖瑪游戲


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花视频在线一区二区在线视频 | 久久 无码 一区二区三区四区 | 亚洲肥胖女人BB | 免费草逼网站 | 三级视频网站 |