用回溯法求解跳马问题

 
算法描述
       一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2),从中任选择一个方向前进,到达新的位置。在从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,就再回退到上一位置…… 

从中任选择一个方向前进,到达新的位置。在从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,就再回退到上一位置……   源程序 #include<iostream> using namespace std; class Tiaoma { public:
       int N;
       int x;
       int y;     
    int A;
       int Count;
       int Map[6][6];
       Tiaoma(int n,int x,int y):N(n),x(x),y(y){A=1;Count=1;}
       void Horse(int x,int y);
       void Print();
    void Roud(); };   void Tiaoma::Horse(int x,int y) {
       if(1<=x-2&&y+1<=N&&Map[x-2][y+1]==0)
       {
       Map[x-2][y+1]=++A;
          Count++;
       Horse(x-2,y+1);
       }
       if(1<=x-1&&y+2<=N&&Map[x-1][y+2]==0)
       {
              Map[x-1][y+2]=++A;
              Count++;
        Horse(x-1,y+2);
       }
       if(x+1<=N&&y+2<=N&&Map[x+1][y+2]==0)
       {
       Map[x+1][y+2]=++A;
          Count++;
       Horse(x+1,y+2);
       }
       if(x+2<=N&&y+1<=N&&Map[x+2][y+1]==0)
       {
       Map[x+2][y+1]=++A;
          Count++;
       Horse(x+2,y+1);
       }
       if(x+2<=N&&1<=y-1&&Map[x+2][y-1]==0)
       {
       Map[x+2][y-1]=++A;
          Count++;
          Horse(x+2,y-1);
       }
       if(x+1<=N&&1<=y-2&&Map[x+1][y-2]==0)
       {
       Map[x+1][y-2]=++A;
          Count++;
       Horse(x+1,y-2);
       }
       if(1<=x-1&&1<=y-2&&Map[x-1][y-2]==0)
       {
       Map[x-1][y-2]=++A;
          Count++;
       Horse(x-1,y-2);
       }
       if(1<=x-2&&1<=y-1&&Map[x-2][y-1]==0)
       {
       Map[x-2][y-1]=++A;
          Count++;
       Horse(x-2,y-1);
       } }   void Tiaoma::Print() {
    cout<<‘/t’;
       for(int i1=1;i1<=N;i1++)
       cout<<i1<<“列”<<‘/t’;
       for(int i=1;i<=N;i++)
       {
              cout<<endl;
              cout<<i<<“行”<<‘/t’;
              for(int j=1;j<=N;j++)
              {
                     cout<<Map[i][j]<<‘/t’;
              }
              cout<<endl;
       } }   void Tiaoma::Roud() {
       cout<<“跳马路线:”<<endl;
       int s=1;
       for(;s<=Count;)
              for(int l=1;l<=N;l++)
                     for(int k=1;k<=N;k++)
                     {
                            if(Map[l][k]==s&&s<Count)
                            {
                                   cout<<“Map[“<<l<<“][“<<k<<“]”<<“->”;
                                   if(s%7==0)
                                          cout<<endl;
                                   s++;
                            }
                            else if(Map[l][k]==s&&s==Count)
                            {
                                   cout<<“Map[“<<l<<“][“<<k<<“]”<<endl;
                                   s++;
                            }
                     }   } void main() {
   Tiaoma horse(5,1,1);
   for(int i=1;i<=horse.N;i++)
        for(int j=1;j<=horse.N;j++)
              horse.Map[i][j]=0;
   horse.Map[horse.x][horse.y]=1;
   horse.Horse(1,1);
   horse.Print();
   horse.Roud(); } 运行结果:  
        1
     2
     3
     4
     5列 1行
     1       22      17      12      3   2行
     16      11      2       7       18   3行
     23      24      21      4       13   4行
     10      15      6       19      8   5行
     25      20      9       14      5 25跳马路线: Map[1][1]->Map[2][3]->Map[1][5]->Map[3][4]->Map[5][5]->Map[4][3]->Map[2][4]-> Map[4][5]->Map[5][3]->Map[4][1]->Map[2][2]->Map[1][4]->Map[3][5]->Map[5][4]-> Map[4][2]->Map[2][1]->Map[1][3]->Map[2][5]->Map[4][4]->Map[5][2]->Map[3][3]-> Map[1][2]->Map[3][1]->Map[3][2]->Map[5][1]   

    原文作者:回溯法
    原文地址: https://blog.csdn.net/a381989813/article/details/1677111
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞