7.4. РСкурсия ΠΈ поисковыС Π·Π°Π΄Π°Ρ‡ΠΈ

    РСкурсия ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€. Π‘Π°ΠΌΡ‹ΠΌ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈ Π½Π΅ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ способом Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поисковых Π·Π°Π΄Π°Ρ‡ являСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Когда Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π΅ мноТСства ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, мноТСства Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠ°Ρ€ ΠΈ Ρ‚.ΠΏ., Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° содСрТит ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² (см. 2.3.). Когда ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… сочСтаний, подмноТСств, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΈΠΊΠ΅, Ρ‚ΠΎ рСкурсия Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ шаг Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° рассматриваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ увСличСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (подмноТСства) Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ размСрности n нСсколько Π·Π°Π΄Π°Ρ‡ размСрности n+1, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ рСкурсивно повторяСтся.

    ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ процСсс построСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (подмноТСства) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· исходного мноТСства. ΠŸΠ°Ρ€Π°Π΄ΠΎΠΊΡ рСкурсивного ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ слСдуСт ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° ΡƒΠΆΠ΅ частично Ρ€Π΅ΡˆΠ΅Π½Π° (Π½Π° самом Π΄Π΅Π»Π΅ – ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ шагами рСкурсии), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ· n элСмСнтов исходного мноТСства R построСна трСбуСмая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ W размСрности k. РСкурсивная функция Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ «добавлСния» ΠΊ W Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта ΠΈΠ· R, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· этих Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² получаСтся аналогичная Π·Π°Π΄Π°Ρ‡Π° размСрности n+1, которая Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ рСкурсивным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ рСкурсии состоит Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Β«ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎΒ» Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° тСкущая Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ n достигаСт размСрности исходного мноТСства R.

    Π’ΠΈΠ΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌ n-Π³ΠΎ ΡˆΠ°Π³Π°Π’Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅T
    ВсС элСмСнтыЦикл for(i=0;i<n;i++)---n
    ВсС ΠΏΠ°Ρ€Ρ‹Π¦ΠΈΠΊΠ» Π² Ρ†ΠΈΠΊΠ»Π΅ for(i=0;i<n-1;i++) for(j=i-1;j<n;j++)---\frac{n(n-1)}{2}
    ВсС ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π°ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ (n-Ρ‹ΠΉ) элСмСнт ΠΈΠ· R ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Β«Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Β» ΠΈ Β«Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Β» Π² W22^n
    ΠŸΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° ΠΈΠ· n ΠΏΠΎ mΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ (n-Ρ‹ΠΉ) элСмСнт ΠΈΠ· R ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Β«Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Β» ΠΈ Β«Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Β» Π² W ΠΏΡ€ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΈ ΠΈΡ… количСства Π² W2(1,0)N! \\ m!(n-m!)
    ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ-Π½ΠΎΡΡ‚ΡŒ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉΠ’ W ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ любой ΠΈΠ· R, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΌ осталсяn...1N!
    ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ-Π½ΠΎΡΡ‚ΡŒ с повторСниямиВ W ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ любой ΠΈΠ· Rnn^n

    ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚ процСсс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС рассматриваСтся Π΄Π²Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ элСмСнта исходного мноТСства: Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅, соотвСтствСнно ΠΈΠΌΠ΅ΡŽΡ‚ мСсто Π΄Π²Π° рСкурсивных Π²Ρ‹Π·ΠΎΠ²Π° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ (n+1) размСрности. ΠžΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ рСкурсии Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС происходит ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° исходного мноТСства, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ – ΠΏΡ€ΠΈ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ количСства элСмСнтов.

    C
    //----------------------------------------------------------74-01
    // ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ всСх подмноТСств
    // R - исходноС мноТСство
    // W - Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ мноТСство (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ)
    // n - Π½ΠΎΠΌΠ΅Ρ€ шага Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ - индСкс Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΠΎΠ³ΠΎ элСмСнтов ΠΈΠ· R
    // k - количСство Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… элСмСнтов
    // N - Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ
    // cnt - счСтчик Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²
    void F1(int W[], int R[], int n, int k, int N, int &cnt) {
      int i;
    
      if (n == N) {
        cnt++;
        printf("\n");  // достигнута трСбуСмая Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ
    
        for (i = 0; i < k; i++) printf("%d ", W[i]);
    
        return;
      }  // подсчСт ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°
    
      F1(W, R, n + 1, k, N, cnt);  // ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ
      W[k] = R[n];
      F1(W, R, n + 1, k + 1, N, cnt);  // ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ
    }
    
    //----------------------------------------------------------
    // Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠΉ ΠΈΠ· n ΠΏΠΎ m
    // m - Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ подмноТСства
    void F2(int W[], int R[], int n, int k, int N, int m, int &cnt) {
      int i;
      if (n > N) return;  // ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ мноТСства
    
      if (k == m) {  // Π²Ρ‹Π±Ρ€Π°Π½ΠΎ m ΠΈΠ· n
        cnt++;
        printf("\n");
        for (i = 0; i < k; i++) printf("%d ", W[i]);
    
        return;
      }  // подсчСт ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°
      F2(W, R, n + 1, k, N, m, cnt);  // ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ
      W[k] = R[n];
      F2(W, R, n + 1, k + 1, N, m, cnt);  // ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ
    }

    Для поисковых Π·Π°Π΄Π°Ρ‡, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ, слова ΠΈ Ρ‚.ΠΏ., Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ограничСниями) имССтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°. Π’ Π½Π΅ΠΌ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ пСрСносится ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом ΠΎΠ½ удаляСтся ΠΈΠ· исходного мноТСства, Π° ΠΏΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ – восстанавливаСтся.

    C
    //----------------------------------------------------------
    // ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ
    void F3(int W[], int R[], int n, int N, int &cnt) {
      int i;
    
      if (n == N) {
        cnt++;
        printf("\n");
    
        for (i = 0; i < n; i++) printf("%d ", W[i]);
    
        return;
      }
    
      for (i = 0; i < N; i++) {  // Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΡΡ
        if (R[i] == 0) continue;  // пропуск ΡƒΠΆΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ
    
        W[n] = R[i];  // Π²Ρ‹Π±ΠΎΡ€ ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ
        R[i] = 0;  // ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· исходного
    
        F3(W, R, n + 1, N, cnt);
    
        R[i] = W[n];  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ
      }
    }
    C
    // Π‘ΠΎΠ»Π΅Π΅ элСгантный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ просто мСняСт 
    // мСстами ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт со всСми ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ.
    //----------------------------------------------------------
    // ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с повторСниями - ΠΎΠ±ΠΌΠ΅Π½ с ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ
    void F4(int R[], int n, int N, int &cnt) {
      int i, c;
    
      if (n == N) {
        cnt++;
        printf("\n");
    
        for (i = 0; i < n; i++) printf("%d ", R[i]);
    
        return;
      }
    
      F4(R, n + 1, N, cnt);  // ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π½Π° своСм мСстС
    
      for (i = n + 1; i < N; i++) {
        c = R[n];
        R[n] = R[i];
        R[i] = c;  // ΠΎΠ±ΠΌΠ΅Π½ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ с ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ
    
        F4(R, n + 1, N, cnt);
    
        c = R[n];
        R[n] = R[i];
        R[i] = c;  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ
      }
    }

    Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ кроссворд. Для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° слов трСбуСтся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ кроссворд. Если ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ слова совпадаСт с Π½Π°Ρ‡Π°Π»ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, МАВРАБ-РАБИБВ), Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ слова ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ставится Π·Π°Π΄Π°Ρ‡Π° - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ‚Π°ΠΊΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ, ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ - Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ минимальной Π΄Π»ΠΈΠ½Ρ‹.

    РСшСниС Π·Π°Π΄Π°Ρ‡Π° базируСтся Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π΅ всСх ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ, рСкурсивная функция для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»Π° рассмотрСна Π²Ρ‹ΡˆΠ΅. Π’ сущности, новая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ упомянутой Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ «с нуля» для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Начало проСктирования любой рСкурсивной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ шага рСкурсивного процСсса. ΠŸΡƒΡΡ‚ΡŒ имССтся ΡƒΠΆΠ΅ составлСнная Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΈΠ· Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… слов. ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ шаг процСсса состоит Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ присоСдинСния ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ слова ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ. Если это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ для Π½ΠΎΠ²ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ слово ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг рСкурсивного процСсса. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    • рСкурсивная функция выполняСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ присоСдинСния ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ слова ΠΊ ΡƒΠΆΠ΅ выстроСнной Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅;

    • Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ являСтся логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π΄Π°Π½Π½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ), функция ΠΈΡ‰Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ подходящий Π²Π°Ρ€ΠΈΠ°Π½Ρ‚;

    • условиСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ рСкурсии являСтся отсутствиС Π΅Ρ‰Π΅ Π½Π΅ присоСдинСнных ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ слов (ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅), Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π½ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ слов (Π½Π΅ΡƒΠ΄Π°Ρ‡Π°).

    ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ исходных слов являСтся глобальной структурой Π΄Π°Π½Π½Ρ‹Ρ… - массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС извлСкаСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт, Π½ΠΎ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ просмотра Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° (послС рСкурсивного Π²Ρ‹Π·ΠΎΠ²Π°) возвращаСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки. Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ строки ΠΈΠ· мноТСства Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² установкС указатСля Π½Π° строку Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

    И Π΅Ρ‰Π΅ нСсколько ΠΌΠ΅Π»ΠΎΡ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ:

    • ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ рСкурсии – достаточно ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ число шагов рСкурсии – ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ размСрности структуры Π΄Π°Π½Π½Ρ‹Ρ…;

    • сама Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… слов ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² Π²ΠΈΠ΄Π΅ прямого, Ρ‚Π°ΠΊ ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ накоплСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ слова просто выводятся Π½Π° экран Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ достиТСнии ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Β«ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…Β» Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠ². Для большСй образности функция подсчитываСт количСство символов, Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Ρ… Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅, для Π²Ρ‹Π²ΠΎΠ΄Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ количСства ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ словом.

    C
    //------------------------------------------------------74-02.cpp
    //----- Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ кроссворд
    char *w[] = {"sinus", "prefix", "setup", "plintus", "drop", NULL};
    
    int N = sizeof(w) / sizeof(char *) - 1;
    
    // lw - Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ слово Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ, s  - число символов Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅
    int step(char *lw, int s, int k) {
      if (k == N) return 1;  //  ВсС слова Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ - успСх
    
      for (int n = 0; w[n] != NULL; n++) {
        int l = strlen(lw);  // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° присоСдинСниС
    
        if (w[n][0] == 0) continue;  // слово ΡƒΠΆΠ΅ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ - ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ
    
        if (k == 0 ||
            lw[l - 1] == w[n][0]) {  // совпадСниС символов ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ слово
          char *pw = w[n];  // Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ
          w[n] = "";  // провСряСмоС слово ΠΈΠ·  мноТСства
    
          if (step(pw, s + l - 1,
                   k + 1)) {  // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° вывСсти Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ слова
            for (int i = 0; i < s + l - 1; i++)  // ΡƒΠ΄Π°Ρ‡Π° - вывСсти слово ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ
              putchar(' ');  // ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ шага рСкурсии
            puts(pw);
    
            return 1;
          }
    
          w[n] = pw;  // Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ слово
        }
      }
    
      return 0;
    }
    
    void main() { step("", 1, 0); }

    Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ (см. Π²Ρ‹ΡˆΠ΅) просто мСняСт мСстами ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт со всСми ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ ΠΏΡ€ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ совпадСнии символов:

    • для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ (i) слова ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅;

    • Ссли Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… (j) совпадаСт с ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, Ρ‚ΠΎ ΠΎΠ½ΠΎ пСрСставляСтся со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ (i+1), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ i+1 слово;

    • Ссли рСкурсивный Π²Ρ‹Π·ΠΎΠ² Π½Π΅ смог Π΄ΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ, Ρ‚ΠΎ пСрСставлСнныС слова Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π° свои мСста;

    • ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ слова Π±ΡƒΠ΄Π΅Ρ‚ располоТСны Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС.

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ способ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (см. 12.4).

    C
    //------------------------------------------------------74-03.cpp
    //----- Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ кроссворд (ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ с ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ строк)
    char *w[] = {"sinus", "prefix", "setup", "plintus", "drop", NULL};
    
    // k - Π½ΠΎΠΌΠ΅Ρ€ шага
    void step(int k) {
      if (w[k + 1] == NULL) throw 1;  // ВсС слова Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ - успСх
    
      int l = 0;
      if (k != -1) l = strlen(w[k]) - 1;  // Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
    
      for (int n = k + 1; w[n] != NULL; n++)  // Ρ‡Π΅Ρ€Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
        if (k == -1 ||
            w[k][l] == w[n][0]) {  // совпадСниС символов ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ слово
    
          char *q = w[k + 1];
          w[k + 1] = w[n];
          w[n] = q;  // ОбмСн Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π·Π°...
    
          step(k + 1);  // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° вывСсти Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΈΠ· Π½ΠΎΠ²ΠΎΠ³ΠΎ слова
    
          q = w[k + 1];
          w[k + 1] = w[n];
          w[n] = q;  // ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΠΌΠ΅Π½ для продолТСния поиска
        }
    }
    
    void main() {
      try {
        step(-1);
      } catch (int v) {  // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ -
    
        for (int s = 0, i = 0; w[i] != NULL;
             i++) {  // Π²Ρ‹Π²ΠΎΠ΄ слов «лСсСнкой» с подсчСтом
    
          for (int j = 0; j < s; j++)
            putchar(' ');  // числа символов Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… словах
    
          s += strlen(w[i]) - 1;
          puts(w[i]);
        }
      }
    }

    ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„Π°. Π—Π°Π΄Π°Ρ‡Π° коммивояТСра. ВрСбуСтся Π½Π°ΠΉΡ‚ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π° всСго мноТСства Β«Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ²Β», Π½Π΅ посСщая ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π³ΠΎΡ€ΠΎΠ΄ Π΄Π²Π°ΠΆΠ΄Ρ‹ (Π·Π°Π΄Π°Ρ‡Π° коммивояТСра). Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π½Π° основС схСмы ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° нСсколько отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. ВСхнология проСктирования рСкурсивных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π΄Π°Π΅Ρ‚ здСсь ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ:

    1. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°Ρ„Π° – ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° расстояний ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними Π³ΠΎΡ€ΠΎΠ΄Π°ΠΌΠΈ (R) (ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° смСТности), Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Rij – отсутствиС прямого ΠΏΡƒΡ‚ΠΈ.

    2. Π¨Π°Π³ рСкурсивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° – ΠΏΡ€ΠΈ «посСщСнии» ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ k-Π³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° дСлаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° двиТСния ΠΊΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ сосСдям, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ аналогичная Π·Π°Π΄Π°Ρ‡Π°.

    3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прямоС Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° – Π΄Π»ΠΈΠ½Ρ‹ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ - lnt ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π° - D, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ минимального ΠΏΡƒΡ‚ΠΈ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π° (lntmin , Dmin) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (Β«ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎΒ» Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ рСкурсии).

    4. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС шага рСкурсивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° – Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Β«Π³ΠΎΡ€ΠΎΠ΄Π°Β» (k), количСство ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ² (шагов рСкурсии- n), Π΄Π»ΠΈΠ½Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ (lnt).

    5. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ рСкурсии – ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ «успСха»: ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹ всС Π³ΠΎΡ€ΠΎΠ΄Π° (n Ρ€Π°Π²Π½ΠΎ размСрности Π·Π°Π΄Π°Ρ‡ΠΈ), отсСчСниС Β«Π½Π΅ΡƒΠ΄Π°Ρ‡Β»: ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ посСщСниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π³ΠΎΡ€ΠΎΠ΄Π°;

    6. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ² – Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ рСкурсивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг рСкурсии добавляСт Π² Π½Π΅Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт – D[n]=k. Но для Π±ΠΎΠ»Π΅Π΅ эффСктивной ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ„Π°ΠΊΡ‚Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ «посСщСния» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив Β«ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊΒ» ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ², индСксируСмый ΡƒΠΆΠ΅ Π½Π΅ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ шага Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π° ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Β«Π³ΠΎΡ€ΠΎΠ΄Π°Β». РСкурсивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ шага провСряСт (M[k]==0) ΠΈ устанавливаСт (M[k]=1) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°, Π° ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ - сбрасываСт Π΅Π³ΠΎ.

    7. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²: Ρ†ΠΈΠΊΠ» ΠΏΠΎ строкС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ смСТности – ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… сосСдСй c пропуском Ρ‚Π΅Ρ…, Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ прямого ΠΏΡƒΡ‚ΠΈ (R[k][i]=0);

    8. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ шага – фактичСскиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ рСкурсивного Π²Ρ‹Π·ΠΎΠ²Π°: Β«Π½ΠΎΠΌΠ΅Ρ€ сосСднСго Π³ΠΎΡ€ΠΎΠ΄Π°Β» - индСкс Ρ†ΠΈΠΊΠ»Π° ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° (i), количСство шагов рСкурсии – n+1, Π΄Π»ΠΈΠ½Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ – lnt+R[k][i];

    9. Условия ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² main – step(0,0,0).

    C
    //------------------------------------------------------74-04.cpp
    //----- Π—Π°Π΄Π°Ρ‡Π° коммивояТСра - ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„Π°
    
    #define N 5
    
    int R[N][N] = {{0, 4, 2, 0, 0},
                   {4, 0, 2, 1, 3},
                   {2, 2, 0, 0, 6},
                   {0, 1, 0, 0, 1},
                   {0, 3, 6, 1, 0}};
    
    int M[N] = {0, 0, 0, 0, 0};  // ΠžΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… "Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ²"
    int W[N];  // ВСкущая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π°
    int Wmin[N];  // ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π°
    int minlnt = -1;  // Π”Π»ΠΈΠ½Π° минимального ΠΏΡƒΡ‚ΠΈ
    
    void step(int n, int k, int lnt) {  // n - Π½ΠΎΠΌΠ΅Ρ€ шага, k - Π½ΠΎΠΌΠ΅Ρ€ "Π³ΠΎΡ€ΠΎΠ΄Π°"
      if (n == N) {  // lnt - Π΄Π»ΠΈΠ½Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ
        if (minlnt == -1 || lnt < minlnt)  // ΠžΠ±Ρ…ΠΎΠ΄ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ - Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ
        {
          minlnt = lnt;  // Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
    
          for (int i = 0; i < N; i++)  // ΠΎΠ±Ρ…ΠΎΠ΄Π°
            Wmin[i] = W[i];
        }
    
        return;
      }
    
      if (M[k] == 1) return;  // ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅
    
      W[n] = k;  // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄Π°
      M[k] = 1;  // ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅
    
      for (int i = 0; i < N; i++) {  // ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ сосСдСй
        if (R[k][i] == 0) continue;  // БосСди Π½Π΅ связаны - ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ
    
        step(n + 1, i, lnt + R[k][i]);  // РСкурсивный Π²Ρ‹Π·ΠΎΠ² для сосСднСго
      }  // "Π³ΠΎΡ€ΠΎΠ΄Π°" с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ расстояния Π΄ΠΎ Π½Π΅Π³ΠΎ
    
      M[k] = 0;
    }  // Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΡƒ
    
    void main() {
      step(0, 0, 0);
      printf("\nmin=%d\ntowns:", minlnt);
    
      for (int i = 0; i < N; i++) printf("%d-", Wmin[i]);
    }

    Π“ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ° с ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ. ВрСбуСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Π²ΡƒΡ… СмкостСй 3 ΠΈ 5 Π»ΠΈΡ‚Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ 4 Π»ΠΈΡ‚Ρ€Π°. РСкурсивный Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Β«Ρ€Π°Π·Π»ΠΈΠ²Π°Β» (заполнСния СмкостСй) имССтся 6 смСТных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· исходного:

    • Π²Ρ‹Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Тидкости ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· СмкостСй;

    • Π΄ΠΎΠ»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Тидкости Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ· СмкостСй (Π΄ΠΎ края);

    • ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Тидкости ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Смкости Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ c ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, сколько Тидкости ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π² исходной Смкости ΠΈ сколько мСста Π΅ΡΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ (ΠΈΠ· этих Π΄Π²ΡƒΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ).

    ЕдинствСнная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΠ²Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ избСТания зацикливания рСкурсии. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² с «прямым» Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ. Π—Π°Π²Π΅Π΄ΠΎΠΌΠΎ нСэффСктивныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΎΡ‚ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ тСкущая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ становится Π΄Π»ΠΈΠ½Π½Π΅Π΅ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ.

    C
    //----------------------------------------------------74-05.cpp
    // Π“ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ°: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±Π°Π½ΠΎΠΊ 3 ΠΈ 5 Π»ΠΈΡ‚Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 4 Π»ΠΈΡ‚Ρ€Π°
    #define P1 3  // Емкости Π±Π°Π½ΠΎΠΊ
    #define P2 5
    #define EX 4  // Π˜ΡΠΊΠΎΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
    #define N 1000
    
    struct var {
      int nmax;  // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
      int V[N][2];  // Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ "Ρ€Π°Π·Π»ΠΈΠ²Π°"
      int D[N];  // Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ дСйствиС
    } VAR, OPT = {-1};
    
    int cnt = 0;  // Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
    
    void F(int v1, int v2, int n) {  // v1,v2 - Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ "Π±Π°Π½ΠΎΠΊ"
      VAR.V[n][0] = v1;  // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° "Ρ€Π°Π·Π»ΠΈΠ²Π°"
      VAR.V[n][1] = v2;
      VAR.D[n] = 0;
    
      if (v2 == EX) {
        if (OPT.nmax == -1 || n < OPT.nmax) OPT = VAR, OPT.nmax = n;
        return;
      }  // НайдСно Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
    
      if (OPT.nmax != -1 && n >= OPT.nmax)
        return;  // Π•ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅
    
      cnt++;
    
      for (int i = 0; i < n; i++)  // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ "Ρ€Π°Π·Π»ΠΈΠ²Π°"
        if (VAR.V[i][0] == v1 && VAR.V[i][1] == v2) return;
    
      // Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ - Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΡƒΡΡ‚ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ "Π±Π°Π½ΠΊΠΈ"
      VAR.D[n]++;
      F(P1, v2, n + 1);
    
      VAR.D[n]++;
      F(v1, P2, n + 1);
    
      VAR.D[n]++;
      F(0, v2, n + 1);
    
      VAR.D[n]++;
      F(v1, 0, n + 1);
    
      // Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ - ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ "Π±Π°Π½ΠΊΠΈ" Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ
      // ОбъСм ΠΏΠ΅Ρ€Π΅Π»ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Тидкости -
      // ΠœΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΠ· остатка Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ свободного мСста Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ
      int dv = (v1 < P2 - v2 ? v1 : P2 - v2);
    
      VAR.D[n]++;
      if (dv != 0) F(v1 - dv, v2 + dv, n + 1);
    
      dv = (P1 - v1 < v2 ? P1 - v1 : v2);
      VAR.D[n]++;
      if (dv != 0) F(v1 + dv, v2 - dv, n + 1);
    }

    Π›Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ

    1. Π’Ρ€ΠΎΠΉΠΊΠΈ ΠΈ сСмСрки. КакоС наимСньшСС число ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΌ свойством, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ записываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΡ„Ρ€ 3 ΠΈ 7 ΠΈ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΈ сумма Π΅Π³ΠΎ Ρ†ΠΈΡ„Ρ€ дСлятся Π½Π° 3 ΠΈ 7? НапримСр, 7 733 733 дСлится Π±Π΅Π· остатка Π½Π° 3 ΠΈ Π½Π° 7, Π½ΠΎ сумма Π΅Π³ΠΎ Ρ†ΠΈΡ„Ρ€ (33) Π½Π° 3 дСлится, Π° Π½Π° 7 Π½Π΅Ρ‚, поэтому ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ.

    2. Π—Π°Π΄Π°Ρ‡Π° ΠΎ дСсяти Ρ†ΠΈΡ„Ρ€Π°Ρ…. Π Π°ΡΡΡ‚Π°Π²ΡŒΡ‚Π΅ всС Π΄Π΅ΡΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ число дСлилось Π½Π° всС числа ΠΎΡ‚ 2 Π΄ΠΎ 18. Если, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ 1 274 953 680, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π΅ΡΡ число Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π° 2, 3, 4, 5 ΠΈ Ρ‚. Π΄. Π΄ΠΎ 16, Π½ΠΎ Π½Π΅ раздСлится Π½Π° 17.

    3. ΠœΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ ΠΎΡ‚ 1 Π΄ΠΎ 9 Ρ€Π°ΡΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ +,-,*,/ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число.

    4. ΠœΠ΅ΠΆΠ΄Ρƒ Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ ΠΎΡ‚ 1 Π΄ΠΎ 9 Ρ€Π°ΡΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ +,- Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число, ΠΈΠ· подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… Ρ†ΠΈΡ„Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 123-45+7+8-9.

    5. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСкурсивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ построСния Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈΠ· ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π°Π±ΠΎΡ€Π° костСй Π΄ΠΎΠΌΠΈΠ½ΠΎ.

    6. На ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС имССтся N Ρ„ΠΈΠ³ΡƒΡ€ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°. Π Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΠΉ минимальноС количСство ΠΊΠΎΠ½Π΅ΠΉ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Β«ΠΏΠΎΠ΄ Π±ΠΎΠ΅ΠΌΒ».

    7. На ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС имССтся N Ρ„ΠΈΠ³ΡƒΡ€ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°. Π Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΠΉ минимальноС количСство слонов Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Β«ΠΏΠΎΠ΄ Π±ΠΎΠ΅ΠΌΒ».

    8. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ 2 строки символов A ΠΈ B, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, AAABAB ΠΈ ABAABBB. Алгоритм просматриваСт ΠΏΠ°Ρ€Ρƒ строк ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ (ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ ΠΏΠ΅Ρ€Π²ΠΎΠΉ (Π²Ρ‚ΠΎΡ€ΠΎΠΉ) строки, Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ символ A(B) Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠΉ (Π²Ρ‚ΠΎΡ€ΠΎΠΉ) строки. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ для прСобразования строк.

    9. Π—Π°Π΄Π°Π½ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈ слов ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«Π±Π°Ρ€Π°ΠΊ, Π±Π°Ρ€Π°Π½, Π±Π°Π½Π°Π½, Π΄ΡƒΡ€Π°ΠΊ, Π±ΡƒΡ‚ΠΎΠ½, Π±ΡƒΡ‚Π°Π½, ΠΏΠΈΡ‚ΠΎΠ½, Π±Π°Ρ€ΠΈΠ½Β». Для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ слов ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ слово ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΎΡΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° 2 Π±ΡƒΠΊΠ²Ρ‹.

    10. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ тСкст ΠΈΠ· строки, содСрТащСй опрСдСлСния цикличСских Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΈΠ΄Π° ...(Иван,ΠŸΠ΅Ρ‚Ρ€,Π€Π΅Π΄ΠΎΡ€=Π–ΠΈΠ»-Π±Ρ‹Π» (синСго,Π±Π΅Π»ΠΎΠ³ΠΎ,ΠΆΠ΅Π»Ρ‚ΠΎΠ³ΠΎ= Ρƒ самого моря)).... Π‘ΠΈΠΌΠ²ΠΎΠ» Β«*Β» опрСдСляСт мСсто подстановки ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· списка Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°. ДопускаСтся Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ тСкст помСщаСтся Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ строку.

    11. Π—Π°Π΄Π°Π½ Π½Π°Π±ΠΎΡ€ слов (массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки). ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… Π»ΡŽΠ±ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ символ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ совпадал с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· символов Π² сСрСдинС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ (Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ Π½Π΅ послСдним). ΠŸΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ слова с отступом ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° строки Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ соотвСтствовали совпадСнию Π±ΡƒΠΊΠ².

    12. Π—Π°Π΄Π°Ρ‡Π° раскраски ΠΊΠ°Ρ€Ρ‚Ρ‹. Π‘Ρ‚Ρ€Π°Π½Ρ‹ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ Π·Π°Π΄Π°Π½Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ смСТности. Если страны i,j ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ ΠΎΠ±Ρ‰ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, Ρ‚ΠΎ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A[i,j] Ρ€Π°Π²Π΅Π½ 1, ΠΈΠ½Π°Ρ‡Π΅ 0. Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ страны Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°. Β«Π Π°ΡΠΊΡ€Π°ΡΠΈΡ‚ΡŒΒ» ΠΊΠ°Ρ€Ρ‚Ρƒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством Ρ†Π²Π΅Ρ‚ΠΎΠ² (гСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ смСТности Π² progrramms/randomatrix.cpp).

    13. Π—Π°Π΄Π°Ρ‡Π° ΠΎ Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°Ρ…. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ систСма ΡƒΠ·Π»ΠΎΠ² ΠΈ соСдинСний. Если ΡƒΠ·Π»Ρ‹ i,j соСдинСны ΠΌΠ΅ΠΆΠ΄Ρƒ собой, Ρ‚ΠΎ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A[i,j] Ρ€Π°Π²Π΅Π½ 1, ΠΈΠ½Π°Ρ‡Π΅ 0. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ минимальноС количСство ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° для выполнСния соСдинСний Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄Π²ΡƒΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² (гСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ смСТности Π² progrramms/randomatrix.cpp).

    14. Π—Π°Π΄Π°Ρ‡Π° провСдСния Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ («созданиС Π²ΠΎΠ΅Π½Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ²Β»). Π‘Ρ‚Ρ€Π°Π½Ρ‹ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ Π·Π°Π΄Π°Π½Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ смСТности. Если страны i,j ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ ΠΎΠ±Ρ‰ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ, Ρ‚ΠΎ элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ A[i,j] Ρ€Π°Π²Π΅Π½ 1, ΠΈΠ½Π°Ρ‡Π΅ 0. НСобходимо Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ страны Π½Π° Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ количСство ΠΏΠ°Ρ€ смСТных стран ΠΈΠ· ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ Π±Ρ‹Π»ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ (гСнСрация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ смСТности Π² progrramms/randomatrix.cpp).

    15. 16 ΠΊΠΎΡ€Π·ΠΈΠ½ располоТили ΠΏΠΎ ΠΊΡ€ΡƒΠ³Ρƒ. МоТно Π»ΠΈ Π² Π½ΠΈΡ… Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒ 55 Π°Ρ€Π±ΡƒΠ·ΠΎΠ² Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ количСство Π°Ρ€Π±ΡƒΠ·ΠΎΠ² Π² Π»ΡŽΠ±Ρ‹Ρ… Π΄Π²ΡƒΡ… сосСдних ΠΊΠΎΡ€Π·ΠΈΠ½Π°Ρ… ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΎΡΡŒ Π½Π° 1?.

    16. Π’ ΠΊΠ»Π΅Ρ‚ΠΊΠ°Ρ… ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доски Ρ€Π°Π·ΠΌΠ΅Ρ€Π° N \times N записаны ΠΏΠΎ горизонталям Π² порядкС возрастания Ρ†Π΅Π»Ρ‹Π΅ числа ΠΎΡ‚ 1 Π΄ΠΎ N^2. На доскС расставлСны N Ρ„Π΅Ρ€Π·Π΅ΠΉ, Β«Π½Π΅ Π±ΡŒΡŽΡ‰ΠΈΡ…Β» Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. Π˜Π½Ρ‹ΠΌΠΈ словами, ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ Π΄Π²Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ, занятыС фСрзями, находятся Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… горизонталях, вСртикалях ΠΈ диагоналях. НайдитС ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму чисСл Π²ΠΎ всСх ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π°Ρ… для N = 10, N = 20 ΠΈ N = 30.

    17. Π‘Ρ€Π΅Π΄ΠΈ всСх Π½Π°Π±ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл, сумма ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ числу N, Π²Ρ‹Π±Ρ€Π°Π½ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ максимальноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ входящих Π² Π½Π΅Π³ΠΎ чисСл. НайдитС минимальноС Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ число, большСС 1, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ для N = 500, N = 700 ΠΈ N = 902. ΠžΡ‚Π²Π΅Ρ‚ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»Π°

    Вопросы Π±Π΅Π· ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сформулируйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Π² тСстС тСхнологичСскиС ΠΏΡ€ΠΈΠ΅ΠΌΡ‹ рСкурсивного программирования. ΠžΡ†Π΅Π½ΠΈΡ‚Π΅ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ рСкурсивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° (аналитичСски). Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ счСтчик рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (ΠΈΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ – сравнСния, пСрСмСщСния, ΠΎΠ±ΠΌΠ΅Π½Π°). Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ тСорСтичСскоС ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ значСния трудоСмкости для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… размСрностСй Π·Π°Π΄Π°Ρ‡ΠΈ.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выполнСния тСстового задания.

    C
    //----------------------------------------------------------------------
    void FF(int A[], int n) {
      if (n == 1) return;
    
      for (int j = 1, k = 0; j < n; j++)
        if (A[j] > A[k]) k = j;
    
      int v = A[k];
      A[k] = A[n - 1];
      A[n - 1] = v;
      FF(A, n - 1);
    }

    ΠžΡΠ½ΠΎΠ²Ρƒ тСста составляСт линСйная рСкурсия: Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 1. Ѐункция Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт массива ΠΈ мСняСт Π΅Π³ΠΎ с послСдним, послС Ρ‡Π΅Π³ΠΎ рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сСбя для части массива, Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ послСдний элСмСнт. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто сортировка Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. РСкуррСнтная Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° трудоСмкости для шага рСкурсии - T_N=T_{N-1} + N, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ общая Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ - T=N^2/2, учитывая, Ρ‡Ρ‚ΠΎ количСство сравнСний - N-1, ΠΈ T_N=T_{N-1} +N-1, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ T=N(N-1)/2.

    C
    int FF(int A[], int n) {  // Π’Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ m – количСство сравнСний
      if (n == 1) return 0;  // ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ рСкурсии
    
      for (int m = 0, j = 1, k = 0; j < n;
           j++, m++)  // Найти ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² массивС
        if (A[j] > A[k]) k = j;
    
      int v = A[k];
      A[k] = A[n - 1];
      A[n - 1] = v;  // ΠžΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒ с послСдним
    
      return FF(A, n - 1) + m;
    }  // РСкурсивный Π²Ρ‹Π·ΠΎΠ² для размСрности, мСньшСй Π½Π° 1
    
    void main() {
      int v = 0, B[10] = {4, 8, 3, 4, 8, 2, 3, 8, 3, 6};
    
      printf("T=%d\n", FF(B, 10));
    
      for (int i = 0; i < 10; i++) printf("%d ", B[i]);
    }
    C
    //------------------------------------------------------74-06.cpp
    //------------------------------------------------------ 1
    int F1(int n) {
      if (n == 1) return 1;
      return (n * F1(n - 1));
    }
    
    //------------------------------------------------------ 2
    int F2(int A[], int a, int b) {
      if (a > b) return 0;
      if (a == b) return A[a];
    
      int m = (a + b) / 2;
      int v1 = F2(A, a, m), v2 = F2(A, m + 1, b);
    
      return v1 > v2 ? v1 : v2;
    }
    
    //------------------------------------------------------ 3
    int F3(int A[], int a, int b) {
      if (a > b) return 0;
      if (a == b) return A[a];
    
      int m = (a + b) / 2;
    
      return F3(A, a, m) + F3(A, m + 1, b);
    }
    
    //------------------------------------------------------ 4
    void F4(int A[], int a, int b) {
      int i, j, mode;
    
      if (a >= b) return;
    
      for (i = a, j = b, mode = 1; i != j; mode > 0 ? i++ : j--)
        if (A[i] > A[j]) {
          int c;
          c = A[i];
          A[i] = A[j];
          A[j] = c;
          mode = -mode;
        }
    
      F4(A, a, i - 1);
      F4(A, i + 1, b);
    }
    
    //------------------------------------------------------ 5
    int F5(int A[], int a, int b, int val) {
      int i, j, mode;
    
      if (a >= b) return -1;
    
      int m = (a + b) / 2;
    
      if (val == A[m]) return m;
    
      if (val < A[m]) return F5(A, a, m - 1, val);
    
      return F5(A, m + 1, b, val);
    }
    
    //------------------------------------------------------ 6
    long F6(int n) {
      if (n == 0 || n == 1) return 1;
    
      return F6(n - 1) + F6(n - 2);
    }
    
    //------------------------------------------------------ 7
    char *F7(char *p, char *s) {
      if (*s == '\0') return p;
    
      *p++ = *s;
      p = F7(p, s + 1);
      *p++ = *s;
    
      return p;
    }
    
    void z7() {
      char *q, S[80];
      *F7(S, "abcd") = 0;
    }
    
    //------------------------------------------------------ 8
    void F8(char *&p, char *s) {
      if (*s == '\0') return;
    
      *p++ = *s;
      F8(p, s + 1);
      *p++ = *s;
    }
    
    void z8() {
      char *q, S[80];
      q = S;
      F8(q, "abcd");
      *q = 0;
    }
    
    //------------------------------------------------------ 9
    double F9(double *pk, double x, int n) {
      if (n == 0) return (*pk);
    
      return *pk + x * F9(pk + 1, x, n - 1);
    }
    
    void z9() { 
      double 
        B[] = {5., 0.7, 4., 3.}, 
        X = 3., 
        Y = F9(B, X, 4); 
    }
    
    //------------------------------------------------------ 10
    void F10(int *p, int nn) {
      if (nn == 1) {
        *p = 0;
        return;
      }
    
      for (int i = 2; nn % i != 0; i++)
        ;
    
      *p = i;
      F10(p + 1, nn / i);
    }