2

私はナイツ ツアーの問題を解決しようとしていましたが、ちょうどそれを作ったところです。今、私はそれを改善したいと思います。開始値を取り、移動するためのステップバイステップの指示を出力します(コマンドライン出力で)。

今私が使用したテクニックは、最初にビデオで与えられた解決策に従ってボードを4つのブロックに分割し(ここではwww.youtube.com%2Fwatch%3Fv%3DdWM5pKYZCHw&b=28)、ボード全体を4つに分割しました。ボックスのシステム。

解決策では、速度を大幅に低下させる2つの異なる可能性を決定するために、多くのバックトラックを行う必要があります. また、技術を改善するためのその他の提案。ここにコードの一部があります(ボード全体で騎士を動かす関数)

void move(int l[8][8][2],int g, int e)  // g and e are the required systems and blocks respectively
{
      backtracking(backtrackarray, l); // calling function to backtrack the array

      backtracking(secondbacktrackarray,l);    againcalling function to backtrack array in different array

      int system = currentsystem(l, currentposition[0], currentposition[1]); //storing the current system

      for (int i = 0; i < 3; i++)
      {
          nextmove(l, currentposition[0], currentposition[1]);  //moving knight

      }

      if (blockshiftpossible(l, system, currentposition[0], currentposition[1])!= 1) // checks if next block shift possible
      {
           backimage(l, backtrackarray); getting back the stored image 

           for (int i = 0; i < 3; i++)
           {
              reversenextmove(l, currentposition[0], currentposition[1]); // moving in the opposite way
           }

      }

      if ((systemshiftpossible(l, currentposition[0], currentposition[1])!= 1) && (g==4) && (e==4)) // checking if system shift is possible

      { 
            backimage(l,secondbacktrackarray); // getting again image from second backtrack array

            for (int i = 0; i < 3; i++)
            {

                 reversenextmove(l, currentposition[0], currentposition[1]);  // moving in opposite direction

            }

            if (systemshiftpossible(l, currentposition[0], currentposition[1])!= 1)
            {

                  for (int i = 0; i < 3; i++)
                  {
                     nextmove(l, currentposition[0], currentposition[1]);

                   }
             }
      }


      if ((blockshiftpossible(l, system, currentposition[0], currentposition[1])
        == 1) && (g!=4))

      {

            blockshift(l, currentposition[0], currentposition[1]);

      }

      else

      {

        cout << "logical error"<<endl;

      } 

}

このテクニックの詳細を確認するには、私の以前の質問 を確認してください。

また、可能であれば、n*n パズルの解決策を得るためにそれを変更する方法も教えてください。

4

0 に答える 0