回溯法解决马步问题

   

public void GetWay()
         {
             map[start.X, start.Y] = 1;
             int I = start.X, J = start.Y, k = 0, U = 0, V = 0;
             while (true)
             {
                 k = 0;
             Heaven:
                 if (k > 7)
                 {
                     if (s.isEmpty())
                     {
                         MessageBox.Show("无解");
                         return;
                     }
                     else
                     {
                         Node temp;
                         temp = s.Pop();
                         k = temp.k + 1;
                         I = temp.i;
                         J = temp.j;
                         goto Heaven;
                     }
                 }
                 else
                 {
                     U = I + meth[k].dx;
                     V = J + meth[k].dy;
                     if (U > cloumns || V > rows || U < 0 || V < 0)
                     {
                         k++;
                         goto Heaven;
                     }
                     else if (map[U, V] == 1)
                     {
                         k++;
                         goto Heaven;
                     }
                     else
                     {
                         if (U == end.X && V == end.Y)
                         {
                             Node n = new Node();
                             n.i = I;
                             n.j = J;
                             n.k = k;
                             s.Push(n);
                             map[I, J] = 1;
                             I = U;
                             J = V;
                             MessageBox.Show("得解");
                             break;
                         }
                         else
                         {
                             Node n = new Node();
                             n.i = I;
                             n.j = J;
                             n.k = k;
                             s.Push(n);
                             map[I, J] = 1;
                             I = U;
                             J = V;
                             k++;
                         }
                     }
                 }
             }
         }

 

以上是回溯法,s是栈,根据流程图可写出算法

此外我还想学习下怎么获得最短路径,希望前辈们可以指点一下。     

posted @ 2012-09-10 22:50  UncleNull  阅读(859)  评论(0编辑  收藏  举报