アルゴリズムのセミナー - ディスカッションは、再帰的なアルゴリズム設計をバックトラックが含まれ

これは、再帰的なプログラミングのバックトラックが含まれています

ディレクトリ

バックトラッキング

1.1コンセプト

  • 再帰は、アルゴリズムの構造でスキル、およびアルゴリズムをバックトラックすることは考えです。
  • 基本的思想の列挙は、すべての可能な解決策を列挙する深さ優先戦略、及び特定の優先条件に従います。
  • 善を設定した後、優先条件は状態の再選択に、以前の状態に戻ります、深さをテストし続け、そして最終的に目標を達成するが、現在の状況に見つかった場合は、テスト工程で、必ずしも最善ではないか、ターゲットを達成することはできません続きますと深さをテストするために続けています。

1.2基本的な考え方

離れて前方の道路から、我々は、中に入ることができ、道路のため、道路の分岐点への最近の復帰に入り、もう一度やり直してくださいすることはできません。

1.3例の問題

1.3.1 Nクイーン問題

  • 請求

N×Nのチェス盤の上にNクイーンを配置すると、女王はお互いを攻撃することはできません。(法的位置)

  • アイデア(最適化を考慮しません)
    • 再帰:次の行の各列の深さをテストするために継続します。
    • 再帰的境界:Nクイーンすべての完全な配置。
    • バック条件:現在の女王は、正規位置(クロスボーダー)が存在しません。
    • 具体的なアイデア:
      1. 以前のすべてのクイーンズを正規の位置に配置することができる場合は、最初の女王などから出発して、次の女王をテストし続けます。
      2. 女王が存在しない場合(範囲外)は、k番目の有効な位置を持っていた場合は、判断され、またK-1クイーン他の法的位置、存在する場合、次の法的位置、k番目の再検クイーンに移動するかどうか、もし存在、ステップ2を繰り返します。
      3. 同様にN - クイーン、その後2の手順を繰り返し、境界再帰要求出力可能溶液の到着後、Nクイーン有効位置に置か。
  • プロセス・ダイアグラムをバックトラック

(画像転送ブログパークは、侵害あれば、現在、作者によって許可されていない、すぐに削除されます!)

  • コアコード
void Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(int k, int n) {//需要摆放n个皇后,当前摆放到了第k行。
    int j;
    if(k > n)//发现可行解
        print(n); //输出可行解
    else {
         for(j = 1;j <= n;j++) {//试探这一行的每一列
            if(Find_The_Valid_Pos(k, j)) {//判断该位置是否合法
                q[k] = j;   //保存位置
                Put_The_Queen_On_The_NOk_Row_And_The_NOj_column(k + 1, n);  //继续试探下一行
            }
        }
    }
}

1.4アルゴリズムの設計

  1. 再帰的に明確な境界(再帰的に停止する場合)
  2. クリア機能再帰関数(関数のパラメータ、関数の戻り値)
  3. 基本的なデザインのアイデアをバックトラック
    1. 限り、現在の層のための法的な選択肢があるので、現在の層、誘惑の次の層の法的前提を確保します。
    2. 現在の層がある場合は、正当なオプションは、再度床に存在し、裁判官を繰り返さない1./2。..
    3. 実現可能な解決策が見つかった場合、決意は1./2を繰り返します。..

1.5 PTA計画問題

1.5.1整数に因数分解とのいくつかの項目

  • 請求

正の整数Nは、いくつかのほかに正の整数であり、分解の様々なあってもよい、例えば、7 = 7 = 6 + 5 + 5 + 1 = 2,7 + 1、··· すべての正の整数Nは、決定した整数計画分解式です。

  • 考え

    • 再帰:
    • 再帰境界:この結果(充填され、全ての数)およびN(ターゲット)に等しいです。
    • バック条件:現在の結果(充填され、すべての数)とN(ターゲット)に等しい(これはもはや実現可能な解決策を表示された後、テストを続ける意味がありません)。
    • 具体的なアイデア:
      1. 各位置の値は、仮に1から開始されます。
    1. 現在の結果は、(既に充填され、全ての数)N(目標値入力)よりもさらに小さい場合、プローブ最大数から最初の値の数n。
      1. 現在の結果場合とNに等しく、再帰が境界、出力可能溶液、およびバック前の状態に(N-2のこの時点でのみ、数)に達し、N-1は、数以来増加し続け、そしてNの結果との間の関係を決定します。
      2. ように、すべての実行可能なソリューショントラバーサルまで。
  • コアコード

void Division(int x, int pos, int result){
    static int counter, array[32];
    if(result != N) {
        for (int i = x; result + i - 1 < N; i++) {
            array[pos] = i;
            Division(i, pos + 1, result + i);
        }
    }
    else{
        counter++;
        std::cout << N << '=';
        for (int i = 0; i < pos - 1; i++)
            std::cout << array[i] << '+';
        if (counter % 4 == 0 || array[pos - 1] == N)
            std::cout << array[pos - 1] << std::endl;
        else
            std::cout << array[pos - 1] << ';';
    }
}

1.5.2完全な配列出力

  • 請求

    • 第nは正の整数で完全な配列(N <10)の出力。
    • そのようなkが存在する場合、出力順序は、辞書式順序、すなわち配列A1、A2、⋯、前方配列B1、B2、⋯、BN、あるA1 = B1、⋯、AK = BK及びAK + 1 <BK + 1 。
  • 考え

    • この問題は、Nクイーン問題と似ている、とでも簡単にプロセスを実行します。実現可能な解決策は、暫定的な発見プロセスまで実現可能な解決策は、バックトラックによって中断されることはありませんことを発見した後にのみ発生しますバックトラックので。
    • 再帰:次の番号をテストし、それが使用されている数字を記入するつもりかどうかを決定します
    • 再帰境界:数N(ターゲット)との全長アラインメントは等しいです。
    • バック条件:数字を埋めるためには、すべてのアップに使用されています。
    • 特定のアイデア(「合法」、すなわち使用されていない現在の層番号に充填されます)
      1. 限り、現在の層のための法的な選択肢があるので、現在の層、誘惑の次の層の法的前提を確保します。
      2. 現在の層がある場合は、正当なオプションは、再度床に存在し、裁判官を繰り返さない1./2。..
      3. 実現可能な解決策が見つかった場合は、判断が1./2繰り返します。..
  • 注意を払います

    目標値と数字入力配列の完全な数は常に同じです。

  • コアコード

/*全局变量*/
int whole_array[32]; // 存储当前的全排列数
int sub[32]; //记录每一个数字是否被用过
int N; //目标值

/*递归函数*/
void Perm (int x){
    static int length = 0; //当前全排列的长度
    if(N <= x - 1){ //判断全排列树的长度是否等于目标值
        for(int i = 1;i <= N;i++) //输出
            printf("%d",whole_array[i]);    
        printf("\n");
    }
    else //只要全排列数的长度小于目标值
        for(int i = 1;i <= N;i++) //由于要输出字典序,每一个位置从1开始试探
            if(sub[i] == 0){ //判断这个数是否被用过
                whole_array[x] = i; //将这个数
                sub[i] = 1; //填入之后将这个数标记为1,即在该全排列数中已经出现
                Perm(x + 1); //到下一个位置继续试探
                sub[i] = 0; //如果发生回溯,那么需要重新将这个数字标记为没有出现过
            }
}

(再生禁止の許可なしに、オリジナルコンテンツをブログ!)

おすすめ

転載: www.cnblogs.com/LYT-Dveloper/p/11632176.html