全探索

全探索
説明すること
• 再帰
• スタック(深さ優先)
• キュー(幅優先)
再帰とは
• プログラムが自分自身を呼び出すこと
=> 関数が同じ関数を呼び出す
• プログラムが短くなる
(関数プログラミング)
• 呼び出す回数が多いと...
階乗
• 0! =
1
• 1! =
1
• 2! =
2*1
• 3! =
3*2*1
• 4! =
4*3*2*1
• 5! =
5*4*3*2*1
...
プログラム1
プログラム2
解説
フィボナッチ数列
• 0、1、1、2、3、5、8、13、21...
• 最初の二項は0,1と定義され、
以後どの項もその前の2つの項の和となっている。
• X番目の数列の数値を求める関数を作る
解説(ソース除く)
• 再帰を用いるために式を立てる
• F[0] = 0
• F[1] = 1
• F[n+2] = F[n+1] + F[n] (n >= 0)
解説(ソース除く)
• 呼び出しが多くなると、メモリが足りなくなる。
スタックとは
• FILO(先入れ後出し)のデータ構造
• 再帰はスタックと同じデータ構造
深さ優先探索
• スタックで実現できる。
例題(部分和問題)
• 整数 a(1), a(2), … , a(n) が与えられる
• 上記の整数の中からいくつかを選び、
その和をちょうど k にすることができるか?
• 制約
o 1 <= n <= 20
o -10^8 <= a(i) <= 10^8
o -10^8 <= k <= 10^8
例
• 入力1
n=4, a = {1,2,4,7}, k = 13
• 出力1
Yes(13 = 2 + 4 + 7)
• 入力2
n=4, a = {1,2,4,7}, k = 13
• 出力2
No
キューとは
• FIFO(先入れ先出し)のデータ構造
幅優先探索
• キューで実現できる。
例題(迷路の最短路)
• 大きさ N
*
M の迷路(N,M >= 100)
• 迷路は通路と壁からできている
• 1ターンに隣接する上下左右4マスの通路へ移動可能
• スタートからゴールまでの移動に必要な最小のターン数
を求める
• ただしスタートからゴールまで移動可能と仮定する
例
• 入力
o .txtに記載
• 出力
22
枝切り
• 探索の必要がない場合は、探索をしない