免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
深さ優先で全配列の応用
問題の説明
N個の連続自然数の完全な配列。
変形:
Nカード(1,2,3,4、...、n)は、すべての可能な順列を取得するがあります。
Nへのボックスアレンジメント
のアイデア
最初の時点で確実に考え列挙法である、可能なすべてのループスルー
可能な各ボックスは、次にN層で処理し、Nであり、最終的な数Nの各々は繰り返されないと判断されます。
成都はO(N ^ 9)の時間複雑で、それは多くの時間を取ると、コードが非常に複雑になる書き込みます。
読み込みトピック
- N番号がありますが、各カセットはNへの可能性を持っています
- アーティファクト:小優先事項に
- カードが配置されているかどうかを決定します
2の考え方
私はまだforループの始まりだと思う
おそらく考えています:
//第一个盒子N种可能
当前位置=1;
for(int i=1;i<=N;i++){
if(没被放入){
放入当前盒子
当前位置=2;//下一个
//第二个盒子N种可能
for(int i2=1;i2<=N;i2++){
if(没有放入){
放入当前盒子
当前位置=3;//下一个
........
//第N个盒子
for(int iN=1;iN<=N;iN++){....结束的标志}
当前位置-1;//返回 N-1层
}
}
当前位置-1; //for2层结束返回for1层
}
}
//程序结束
明らかに、これはプログラミングの負担を軽減しない、とNの値が変化したら、あなたは、コードを変更する必要が...とにかく、私は母にそれを行うにはしたくありません。
このコードの分析は、それぞれの層のためのタスク実行サイクル中に見出すことができる同じである。現在のところに入れての最小数を見つけるために、次の層、排出した後、配列の群の層にジャンプレイヤージャンプバック。現在位置ジャンプN + 1(N + 1自体が存在しない):順序付けられた終了フラグのセット
アイデア3
そして、それは、「再帰的」プログラミング私をもたらします:
- 同じタスクを処理する反復コードセグメント
- そこ終了フラグ
層ごとも前のレベルに戻っている位置のこの関数の最初の呼び出しに戻るに戻り再帰、リターンの再帰関数の一種と考えることができます。
int box[10],book[10],N=5;
//解决第step个盒子前的组合问题
void df(int step){
//结束标志
if(step == N+1){
//打印盒子数组种的值
for(int i=1;i<=N;i++)
cout<<box[i];
cout<<endl;
return;//返回上一层
}
//遍历N种可能
for(int i=1;i<=N;i++){
//判断是否被占用,判断是否被标记
if(book[i]!=1){
//放入
box[step] = i;
//置标记
book[i]=1;
//跳入下一层
df(step +1);
//跳回本层
book[i]=0;//拿出卡片,继续循环
}
}
return;//跳回上一层
}
深さ優先探索
基本的な考え方は、実際にはより限定された検索の深さのモデルであり、
void dfs(int step){
判断边界
尝试每一种可能{
继续下一步 ;
}
全部完成返回上一步
}
実際に、私は個人的には主に、入ってくるパラメータをつかむコードセグメントを繰り返し、条件を終了するために、再帰が困難であると感じています。