算法描述
一只马在棋盘的某一点,它可以朝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]