dfs検索
6913 ワード
貧挙法は,列挙法とも呼ばれ,可能な解の集合から各要素を一つ一つ列挙し,与えられた検査条件でどれが無用で,どれが役に立つかを判定する.命題をすぐに解くことができる.
窮挙法は本質的に検索アルゴリズムに属するが、彼は検索とは異なる.列挙法の解に適用される問題は満たさなければならないからだ.解の数を予め確定することができる.解変数の値範囲を予め決定する.
窮挙アルゴリズムの鍵は,まずループの範囲を決定し,次に判断解の条件を探し出すことである.この2つのキーを解決するには,窮屈なアルゴリズムで問題を解くのは簡単である.
探索アルゴリズムは窮挙法と類似しており,ループで書けない窮挙アルゴリズムに対しては再帰的またはキューを用いて解を実現する.検索のプロセスは検索ツリーを構成し、検索は実際には検索ツリーの遍歴である.
探索の順序は深さ優先探索(DFS)と広さ優先探索(BFS)の2種類に分けられる.ここで、深さ優先探索は、探索ツリーの深さに沿ってツリーのノードを遍歴し、できるだけ深くツリーの枝分かれを探索する.DFSは通常再帰的な方法で実現される.
広さは、拡張可能な各ノードを優先的に検索し、レイヤノードがすべて検索されると、最初の拡張可能なノードが拡張可能なすべてのノードを順次検索します.
検索の順序のほかに、盲目的な検索と啓発的な検索に分けられる検索方法もあります.
イニシアチブ検索は,検索過程に問題に関するイニシアチブ情報を加え,検索が最も有望な方向に進むよう指導し,不要な検索過程を除去し,問題解を加速させ最適解を得る.
啓発的探索の一般的なアルゴリズムはA*アルゴリズム,アナログアニーリングアルゴリズム,遺伝アルゴリズムなどがあり,我々が最もよく用いるのはA*アルゴリズムである.A*アルゴリズムの最も古典的な例は八数コード問題であり、状態関数hは目標位置に到達していない数字の個数に設定される.
再帰dfs n本の木の棒は全部で何個の異なる三角形をつづることができます
dfs例_コンパクト式0
窮挙法は本質的に検索アルゴリズムに属するが、彼は検索とは異なる.列挙法の解に適用される問題は満たさなければならないからだ.解の数を予め確定することができる.解変数の値範囲を予め決定する.
窮挙アルゴリズムの鍵は,まずループの範囲を決定し,次に判断解の条件を探し出すことである.この2つのキーを解決するには,窮屈なアルゴリズムで問題を解くのは簡単である.
探索アルゴリズムは窮挙法と類似しており,ループで書けない窮挙アルゴリズムに対しては再帰的またはキューを用いて解を実現する.検索のプロセスは検索ツリーを構成し、検索は実際には検索ツリーの遍歴である.
探索の順序は深さ優先探索(DFS)と広さ優先探索(BFS)の2種類に分けられる.ここで、深さ優先探索は、探索ツリーの深さに沿ってツリーのノードを遍歴し、できるだけ深くツリーの枝分かれを探索する.DFSは通常再帰的な方法で実現される.
広さは、拡張可能な各ノードを優先的に検索し、レイヤノードがすべて検索されると、最初の拡張可能なノードが拡張可能なすべてのノードを順次検索します.
検索の順序のほかに、盲目的な検索と啓発的な検索に分けられる検索方法もあります.
イニシアチブ検索は,検索過程に問題に関するイニシアチブ情報を加え,検索が最も有望な方向に進むよう指導し,不要な検索過程を除去し,問題解を加速させ最適解を得る.
啓発的探索の一般的なアルゴリズムはA*アルゴリズム,アナログアニーリングアルゴリズム,遺伝アルゴリズムなどがあり,我々が最もよく用いるのはA*アルゴリズムである.A*アルゴリズムの最も古典的な例は八数コード問題であり、状態関数hは目標位置に到達していない数字の個数に設定される.
再帰dfs n本の木の棒は全部で何個の異なる三角形をつづることができます
#include
#include
#include
using namespace std;
int n,l[15];
//
// 100 +
bool h[10000];
//
// , 0 ,
//
bool is_triangle(int a,int b,int c){
return !h[a*100+b]&&a&&b&&c&&a+b>c&&a+c>b&&b+c>a&&(h[a*100+b]=true);
}
//
//
int dfs(int index,int a,int b,int c){
if(index==n){
return areturn dfs(index+1,a+l[index],b,c)+dfs(index+1,a,b+l[index],c)+dfs(index+1,a,b,c+l[index]);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;iscanf("%d",&l[i]);
}
memset(h,0,sizeof(h));
printf("%d
",dfs(0,0,0,0));
}
return 0;
}
dfs例_コンパクト式0
#include
using namespace std;
int n; // N
bool opr[10]; // bool n-1 , true "+", false "-"。
bool found = false; // , "None"
// dfs , :deep , ;sum 。
// sum 0, 。 opr 。
void dfs(int deep, int sum) {
// 。
if (deep == n) {
if (sum == 0) {
found = true;
// , 。
// 。
for(int i=1;i<=n-1;i++){
if(opr[i])
printf("%d+",i);
else
printf("%d-",i);
}
printf("%d
",n);
}
return ;
}
// 。
opr[deep] = true;
dfs( deep+1, sum+deep+1);
opr[deep] = false;
dfs( deep+1 , sum-deep-1 );
}
// main , ~
int main() {
while(scanf("%d",&n)!=EOF){
found=false;
dfs(1,1);
if(found==false)
printf("None
");
}
return 0;
}