網頁

顯示具有 Depth-first Search 標籤的文章。 顯示所有文章
顯示具有 Depth-first Search 標籤的文章。 顯示所有文章

2014年5月27日 星期二

UVa 10364 Square

想法:
    dfs加上各種減支:
  1. 如果所有stick的長度和(sum)不能被4整除直接輸出no
  2. 如果最長stick的長度已經大於(sum/4)直接輸出no
  3. dfs的時候已經排完三個邊直接return true,因為第四個邊一定排得出來
  4. 先將stick由大排到小,每次dfs的時候stick不要從第一個開始挑選,而是要從上一層dfs選到的stick的下一個開始選。
基本上第四點是關鍵,有跟沒有就是0.0x秒和TLE的差別。

2014年5月26日 星期一

UVa 11218 KTV

題意:
    總共有9個人(編號1~9)要分成3組唱歌,每組3個人,每個人只能唱一次。第一行N表示底下有N種組合,每種組合a,b,c,s,前三個是人員編號,s是該組合的分數。從N種中任選三種組合使得1~9號都能唱到歌,並且使得分數的和最高,輸出該分數,如果找不到組合滿足大家都能唱到歌則輸出-1。

想法:
    bitmask,(1<<9)-1表示所有人都唱的到歌的狀態,二進位來看就是(111111111)2,dp[i]=j表示在狀態i的情況下最高分數為j,因此dp[(1<<9)-1]就是所有人唱的到歌的最高分數。
    用dfs來枚舉不同組合,當人員沒有重複的時候才能將兩個狀態合併在一起,例如(000000111)2和(000111000)2這兩個狀態可以合併變成(000111111)2,並去更新dp[(000111111)2]的分數,不斷更新所有可能的合併來枚舉所有情況。

2014年3月9日 星期日

UVa 604 The Boggle Game

題意:
    在一個4x4 board裡找出所有符合的4個字元的單字,該單字須符合剛好只有2個母音('Y'也算母音),每次Case有兩個board,找出這兩個board交集的所有單字。

想法:
    用DFS+backtracking先分別找出一個board的所有符合的單字,然後再將兩個board找出來的單字作交集:

2014年3月7日 星期五

UVa 10305 Ordering Tasks

想法:
    輸出只要符合是一個topological sort即可,因此可以從起點(沒有被任何點連入的點)用DFS走遍,並同時記錄走遍的點,最後再逆向輸出這些點就是一個topological sort。


UVa 11606 Pick up sticks

想法:
    把放在最上面(也就是這個點沒有其他點連入)的stick當做起點,用DFS走遍,並將走遍的經過的點記錄下來,最後逆向輸出這些記錄的點就是一個topological sort。


UVa 200 Rare Order

題意:
  Input給的那些字串是每個index的名稱,而這些Index是照"某個字典序"由小到大排好的(就像一般的目錄是從A~Z排好),我們要從Input裡面判斷這些字的字典序。例如Sample Input:
  XWY
  ZX
  ZXY
  ZXW
  YWWX
    我們可以從XWY和ZX判斷X<Z,ZXY和ZXW判斷Y<W,ZXW和YWWX判斷Z<Y,所以可以得到X<Z<Y<W。

**本題測資只有一個**

想法:
  一次兩行判斷,找出誰<誰,記錄完之後,從沒有被連入的點當做起點,使用DFS走遍並記下走遍的點,將記下的點逆向輸出就是一個topological sort。


2014年2月27日 星期四

UVa 10308 Roads in the North

題意:
  計算該graph最遠的距離。
想法:
  DFS function 定義為"回傳該點能走的最遠深度",例如DFS(p點),則在DFS裡面我們對p點能前往的那些點做DFS,記下該路徑(route)的長度,並一直刷新route_max的大小,最後回傳route_max。
  在刷新route_max"之前",我們先把(route+route_max)與ans比較,刷新ans,(route+route_max)表示p點往兩個不同方向的路徑的和,不斷刷新ans,就能產生最遠的距離。



UVa 10592 Freedom FIghter

題意:
  'B'為fighter,'P'為enemy,'*'圍起來的範圍內為一個sector,sector的編號由左至右由上至下,要計算每個sector裡面有幾組fighter和幾組enemy,如果fighter和enemy面對面的話,表示有2個group在fighting position。
面對面的情況只會各有一組,
BBB
PP
不會有底下這種情況
BBB
PP
BBB

想法:
  用DFS_1來走遍該sector,如果碰到'B'或'P'則用DFS_2走遍該group,並確認有沒有碰到另一個group。


2014年2月19日 星期三

UVa 539 The Settlers of Catan

題目連結
想法:
  將每個點能連到哪些點存起來,然後對每個點使用DFS看該點最遠能走多深。



UVa 571 Jugs

想法:
  題目沒說要最少步數(先輸出10次fill A empty A也可),所以直接用DFS求解即可。


2014年2月17日 星期一

UVa 260 Il Gioco dell'X

想法:
  因為題目說一定有人獲勝,獲勝條件為黑色是由上走到下,白色是要由左走到右,因此就用DFS確認即可。



2014年2月16日 星期日

UVa 352 The Seasonal War

題意:
  要確認畫面中有幾隻Eagles,每個pixel如果是'1'代表為一隻Eagles,但上下左右(包含斜角共8個方向)相連的'1'只能算是同一隻。

想法:
  使用DFS找'1'有幾個區域。


2014年2月12日 星期三

UVa 657 The die is cast

題意:
  定義上下左右如果有一樣的符號,這些符號為connected。
  分辨骰子某一面的點數,以'*'圍起來的面積代表那是骰子的某一面,在那裡面要計算有幾個點數,而且如果有多個'X'是connected,只能算作一個點數,例如sample input裡面左上為2,右上為1(因為'X'是connected),左下為2,右下為4。

想法:
  當碰到'*'的時候,代表有一塊區域,進入DFS_pixel走遍該區域,每走到一個點就將'*'變成'.'避免重複走過,如果碰到'X',一樣代表有一塊X區域,計數器+1,並進入DFS_X走遍該區域,並將走到的點從'X'轉為'*'。