萬能的搜索的學(xué)習(xí)——深度優(yōu)先搜索

深度優(yōu)先遍歷圖的方法是,從圖中某頂點(diǎn)v出發(fā):

  • 訪問頂點(diǎn)v;
  • 依次從v的未被訪問的鄰接點(diǎn)出發(fā)愚战,對(duì)圖進(jìn)行深度優(yōu)先遍歷;直至圖中和v有路徑相通的頂點(diǎn)都被訪問齐遵;
  • 若此時(shí)圖中尚有頂點(diǎn)未被訪問凤巨,則從一個(gè)未被訪問的頂點(diǎn)出發(fā),重新進(jìn)行深度優(yōu)先遍歷洛搀,直到圖中所有頂點(diǎn)均被訪問過為止

理解深度優(yōu)先搜索的關(guān)鍵在于解決“當(dāng)下該如何做”敢茁。至于“下一步如何做”,則與“當(dāng)下該如何做”事一樣的留美。下面代碼就是深度優(yōu)先搜索的基本模型彰檬。

  void dfs(int step)
{
  //判斷邊界
  //嘗試每一種可能 
  for(int i = 1; i <= n; i++){
      //繼續(xù)下一步
      dfs(step+1);
  }
}

下面我們來看一道奧數(shù)題伸刃,口口口+口口口=口口口,將數(shù)字1~9分別填入9個(gè)口中逢倍,每個(gè)數(shù)字只能使用一次使得等式成立捧颅。例如173+286=459就是一個(gè)合理的組合,請(qǐng)問一個(gè)有多少種合理的組合呢较雕?

我們嘗試一下用深度優(yōu)先搜索來解一下這道題碉哑,19個(gè)數(shù)字,我們就把它看成是19的九張撲克牌亮蒋,然后將這九張撲克牌放到九個(gè)盒子中扣典,使得等式成立。我們用a[9]來表示盒子里面的撲克牌慎玖,那么只要判斷一下 a[1]100+a[2]10+a[3]+a[4]100+a[5]10+a[6] = a[7]100+a[8]10+a[9]這個(gè)等式是否成立贮尖。
代碼和解釋如下:

#include <stdio.h>

int a[10], mark[10], total = 0;

// step表示現(xiàn)在站在第幾個(gè)盒子面前
void depthFirstSearch(int step)
{
    int i;
    // 如果站在第10盒子面前,則表示前9個(gè)盒子已經(jīng)放好撲克牌
    if (step == 10) {
        // 判斷是否滿足等式
        if (a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6] == a[7]*100+a[8]*10+a[9]) {
            // 如果滿足要求可行性的解+1趁怔,并打印這個(gè)解
            total++;
            printf("可行性的解%d: %d%d%d + %d%d%d = %d%d%d\n",total,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
        }
        // 返回最近調(diào)用函數(shù)的地方
        return;
    }
    
        // 此時(shí)站在第step個(gè)盒子前湿硝,應(yīng)該放那張牌,按照1润努、2关斜、3...n嘗試
        
        for (i = 1; i <=9; i++) {
            // 判斷撲克牌i是否還沒有用
            if (mark[i] ==0) {

                a[step] = i;    // 將i放到第step個(gè)盒子中
                mark[i] = 1;    // 將mark[i]的值設(shè)為1,表示撲克牌i已經(jīng)被用過了
                
                // 接下來是利用遞歸放置下一個(gè)盒子的牌了
                depthFirstSearch(step+1);
                // 將剛才嘗試的撲克牌收回铺浇,才能進(jìn)行下一次的嘗試
                mark[i] = 0;
                
            }
    }
    return;
}

int main(int argc, const char * argv[]) {

    depthFirstSearch(1);
    
    // 因?yàn)?173+286 = 459 和 286+173 = 459是同一個(gè)組合
    printf("有%d組",total / 2);
    
    getchar();getchar();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痢畜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子随抠,更是在濱河造成了極大的恐慌裁着,老刑警劉巖繁涂,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拱她,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扔罪,警方通過查閱死者的電腦和手機(jī)秉沼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矿酵,“玉大人唬复,你說我怎么就攤上這事∪梗” “怎么了敞咧?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辜腺。 經(jīng)常有香客問我休建,道長乍恐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任测砂,我火速辦了婚禮茵烈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砌些。我一直安慰自己呜投,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布存璃。 她就那樣靜靜地躺著仑荐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪有巧。 梳的紋絲不亂的頭發(fā)上释漆,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音篮迎,去河邊找鬼男图。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甜橱,可吹牛的內(nèi)容都是我干的逊笆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼岂傲,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼难裆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镊掖,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤乃戈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亩进,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體症虑,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年归薛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍憔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡主籍,死狀恐怖习贫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情千元,我是刑警寧澤苫昌,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站幸海,受9級(jí)特大地震影響祟身,放射性物質(zhì)發(fā)生泄漏屋厘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一月而、第九天 我趴在偏房一處隱蔽的房頂上張望汗洒。 院中可真熱鬧,春花似錦父款、人聲如沸溢谤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽世杀。三九已至,卻和暖如春肝集,著一層夾襖步出監(jiān)牢的瞬間瞻坝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工杏瞻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留所刀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓捞挥,卻偏偏與公主長得像浮创,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砌函,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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