用回溯法求解跳马问题

 
算法描述
       一只马在棋盘的某一点,它可以朝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]
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值