Leetcode 909. 蛇梯棋(廣度優(yōu)先搜索)

問(wèn)題描述

N x N 的棋盤 board 上祷肯,按從 1 到 N * N 的數(shù)字給方格編號(hào),編號(hào) 從左下角開(kāi)始疗隶,每一行交替方向佑笋。
例如,一塊 6 x 6 大小的棋盤斑鼻,編號(hào)如下:



r行 c 列的棋盤蒋纬,按前述方法編號(hào),棋盤格中可能存在 “蛇” 或 “梯子”坚弱;如果 board[r][c] != -1蜀备,那個(gè)蛇或梯子的目的地將會(huì)是 board[r][c]。
玩家從棋盤上的方格 1 (總是在最后一行史汗、第一列)開(kāi)始出發(fā)琼掠。
每一回合,玩家需要從當(dāng)前方格 x 開(kāi)始出發(fā)停撞,按下述要求前進(jìn):
選定目標(biāo)方格:選擇從編號(hào) x+1瓷蛙,x+2,x+3戈毒,x+4艰猬,x+5,或者 x+6 的方格中選出一個(gè)目標(biāo)方格 s 埋市,目標(biāo)方格的編號(hào) <= N * N冠桃。
該選擇模擬了擲骰子的情景,無(wú)論棋盤大小如何道宅,你的目的地范圍也只能處于區(qū)間 [x+1, x+6] 之間食听。
傳送玩家:如果目標(biāo)方格 S 處存在蛇或梯子胸蛛,那么玩家會(huì)傳送到蛇或梯子的目的地。否則樱报,玩家傳送到目標(biāo)方格 S葬项。
注意,玩家在每回合的前進(jìn)過(guò)程中最多只能爬過(guò)蛇或梯子一次:就算目的地是另一條蛇或梯子的起點(diǎn)迹蛤,你也不會(huì)繼續(xù)移動(dòng)民珍。
返回達(dá)到方格 N*N 所需的最少移動(dòng)次數(shù),如果不可能盗飒,則返回 -1嚷量。

Example

示例圖見(jiàn) “問(wèn)題描述” 中的圖片
輸入:[
[-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1],
[-1,35,-1,-1,13,-1],
[-1,-1,-1,-1,-1,-1],
[-1,15,-1,-1,-1,-1]]
輸出:4
解釋:
首先,從方格 1 [第 5 行逆趣,第 0 列] 開(kāi)始蝶溶。
你決定移動(dòng)到方格 2,并必須爬過(guò)梯子移動(dòng)到到方格 15宣渗。
然后你決定移動(dòng)到方格 17 [第 3 行身坐,第 5 列],必須爬過(guò)蛇到方格 13落包。
然后你決定移動(dòng)到方格 14部蛇,且必須通過(guò)梯子移動(dòng)到方格 35。
然后你決定移動(dòng)到方格 36, 游戲結(jié)束咐蝇。
可以證明你需要至少 4 次移動(dòng)才能到達(dá)第 N*N 個(gè)方格涯鲁,所以答案是 4。

Note

  • 2 <= board.length = board[0].length <= 20
  • board[i][j] 介于 1 和 N*N 之間或者等于 -1有序。
  • 編號(hào)為 1 的方格上沒(méi)有蛇或梯子抹腿。
  • 編號(hào)為 N*N 的方格上沒(méi)有蛇或梯子。

題目鏈接:909. 蛇梯棋 (難度:中等)

思路

這個(gè)問(wèn)題有兩個(gè)關(guān)鍵點(diǎn)旭寿,一個(gè)是要將給定的編號(hào) num 轉(zhuǎn)換為棋盤上對(duì)應(yīng)的坐標(biāo)(x , y)警绩;另一個(gè)則是要注意,由于梯子和蛇都是必須要經(jīng)過(guò)的盅称,因此棋盤當(dāng)中可能會(huì)存在環(huán)肩祥。
對(duì)于第一個(gè)任務(wù),我們只需要去模擬棋盤上數(shù)字的分布規(guī)律即可缩膝。
對(duì)于第二個(gè)任務(wù)混狠,我們可以用一個(gè) visited 數(shù)組來(lái)標(biāo)記所有經(jīng)過(guò)的點(diǎn)(包含了用骰子擲出來(lái)的編號(hào),也包含了利用蛇或是梯子經(jīng)過(guò)的點(diǎn)的編號(hào))疾层。雖然棋盤規(guī)則當(dāng)中沒(méi)有規(guī)定走過(guò)的點(diǎn)不能重復(fù)走将饺,但是由于題目要求的是移動(dòng)的最小次數(shù),而重復(fù)走的點(diǎn)對(duì)于最小移動(dòng)次數(shù)是沒(méi)有貢獻(xiàn)的,因此該策略是完備的(即只要有解就必定能搜出來(lái)予弧,如果搜不出來(lái)說(shuō)明必定沒(méi)有解)刮吧。

代碼

class Solution {
public:
    inline void getCoordinate(int N,int num, int& row, int& col){
        row = N - 1 - (num - 1) / N;
        int tmp = (num - 1) % N;
        col = (N - row) & 1 ? tmp : N - 1 - tmp;
    }
    int snakesAndLadders(vector<vector<int>>& board) {
        int N = board.size();
        vector<vector<bool>> visited(N, vector<bool>(N, false));
        queue<int> my_queue;
        my_queue.push(1);
        int times = 0;
        bool flag = false;
        while(!my_queue.empty()){
            int len = my_queue.size();
            for(int i = 0;i < len;++i){
                auto cur = my_queue.front();
                my_queue.pop();
                if(cur == N * N){
                    flag = true;
                    break;
                }
                for(int j = 1;j <= 6;++j){
                    int num = cur + j;
                    if(num > N * N)
                        break;
                    int nx = 0, ny = 0;
                    getCoordinate(N,num, nx, ny);
                    if(visited[nx][ny])
                        continue;
                    visited[nx][ny] = true;
                    if(board[nx][ny] == -1){
                        my_queue.push(num);
                    }else{
                        my_queue.push(board[nx][ny]);
                        visited[nx][ny] = true;
                    }
                }
            }
            if(flag)
                break;
            ++times;
        }
        return flag ? times : -1;
    }
};

執(zhí)行結(jié)果: 32 ms, 12 MB

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市掖蛤,隨后出現(xiàn)的幾起案子皇筛,更是在濱河造成了極大的恐慌,老刑警劉巖坠七,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異旗笔,居然都是意外死亡彪置,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝇恶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拳魁,“玉大人,你說(shuō)我怎么就攤上這事撮弧∨税茫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵贿衍,是天一觀的道長(zhǎng)授舟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贸辈,這世上最難降的妖魔是什么释树? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮擎淤,結(jié)果婚禮上奢啥,老公的妹妹穿的比我還像新娘。我一直安慰自己嘴拢,他們只是感情好桩盲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著席吴,像睡著了一般赌结。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孝冒,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天姑曙,我揣著相機(jī)與錄音,去河邊找鬼迈倍。 笑死伤靠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宴合,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼焕梅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卦洽?” 一聲冷哼從身側(cè)響起贞言,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阀蒂,沒(méi)想到半個(gè)月后该窗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚤霞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年酗失,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧绣。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡规肴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夜畴,到底是詐尸還是另有隱情拖刃,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布贪绘,位于F島的核電站兑牡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏税灌。R本人自食惡果不足惜发绢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垄琐。 院中可真熱鬧边酒,春花似錦、人聲如沸狸窘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翻擒。三九已至氓涣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陋气,已是汗流浹背劳吠。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巩趁,地道東北人痒玩。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蠢古。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奴曙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355