2

我试图解决骑士巡回赛的问题,而我刚刚做到了。现在我想改进它。它采用起始值,然后输出逐步指令移动(在命令行输出中)。

现在我使用的技术是,首先我根据视频中给出的解决方案将电路板分成 4 个块(此处为 www.youtube.com%2Fwatch%3Fv%3DdWM5pKYZCHw&b=28),并将整个电路板分成 4盒子系统。

在解决方案中,我必须做很多回溯来决定两种不同的可能性,这大大降低了速度。有没有办法减少或不回溯来决定两种可能性。以及任何其他改进技术的建议。这是代码的一部分(使骑士全面移动的功能)

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;

      } 

}

要查看此技术的详细信息,请查看我之前的问题 Solving knight tour with c++

如果可能的话,我如何更改它以获得 n*n 谜题的解决方案。

4

0 回答 0