#include"stdio.h"
int a[12][12]={0};//棋盘
int cut=0;//缓存马所走的步数
long count=0;//计算有多少种踏法
void horse(int x,int y);
bool walk(int index,int *x,int *y);
void print();
/*
马每走一步就将该坐标修改为踏的第几格(如:第一格为1,第二格为2...)总共64格 踏完输出
马理论上不论在哪个点都有八个地方可走,为了防止空指针异常,给边上加两圈,
相当于从第二行到第九行,第二列到第九列,遍历棋盘上的每一个点找到所有解 。
将八个位置存起来 每次准备踏的位置由 walk()计算,若能踏则计算出来,给该格赋值为第几格
然后递归调用 horse()继续前行,如果前行后发现无路可走,马退回来(递归的那个函数结束,从栈中弹出),
然后清除刚才位置的标记,继续递归.
踏完的标志位cut=64,踏完后输出 然后对刚才的位置进行擦除 直到递归结束
*/
int main()
{
for(int i=2;i<10;i++)
{
for(int j=2;j<10;j++)
{
//外面的两层循环用于遍历棋盘上的所有点
cut=0;
a[i][j]=++cut;//放马
horse(i,j);//跑
a[i][j]=0;//跑完后擦除足迹
}
}
}
void horse(int x,int y)
{
bool resule=false;
for(int i=0;i<8;i++)//对马的八个方向进行遍历
{
if(walk(i,&x,&y))//判断该方向是否能走
{
a[x][y]=++cut;//能走 上面的walk改变x,y的值到可以走的点 a[x][y]让马踏上来
if(cut==64)//结束条件
{
print();//输出棋盘
a[x][y]=0;
cut--;
break;
}
else
{
horse(x,y);//能踏且没结束 继续前行
a[x][y]=0;//踏上去后无路可走 擦除刚才路的痕迹 继续找路
cut--;
}
}
}
}
bool walk(int index,int *x,int *y)
{
int i=*x,j=*y;
bool result=false;
switch(index)//计算马向各方向踏的坐标
{
case 0:i=i+2,j=j+1;break;
case 1:i=i+1,j=j+2;break;
case 2:i=i-1,j=j+2;break;
case 3:i=i-2,j=j+1;break;
case 4:i=i-2,j=j-1;break;
case 5:i=i-1,j=j-2;break;
case 6:i=i+1,j=j-2;break;
case 7:i=i+2,j=j-1;break;
}
if(i>1&&i<10&&j>1&&j<10&&a[i][j]==0)//判断该地方能不能踏
{ //能踏就将马移到这个位置
*x=i;
*y=j;
result=true;
}
return result;
}
void print()
{
count++;
printf("count=%ld\n",count);
for(int i=2;i<10;i++)
{
for(int j=2;j<10;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
printf("\n\n\n");
}
int a[12][12]={0};//棋盘
int cut=0;//缓存马所走的步数
long count=0;//计算有多少种踏法
void horse(int x,int y);
bool walk(int index,int *x,int *y);
void print();
/*
马每走一步就将该坐标修改为踏的第几格(如:第一格为1,第二格为2...)总共64格 踏完输出
马理论上不论在哪个点都有八个地方可走,为了防止空指针异常,给边上加两圈,
相当于从第二行到第九行,第二列到第九列,遍历棋盘上的每一个点找到所有解 。
将八个位置存起来 每次准备踏的位置由 walk()计算,若能踏则计算出来,给该格赋值为第几格
然后递归调用 horse()继续前行,如果前行后发现无路可走,马退回来(递归的那个函数结束,从栈中弹出),
然后清除刚才位置的标记,继续递归.
踏完的标志位cut=64,踏完后输出 然后对刚才的位置进行擦除 直到递归结束
*/
int main()
{
for(int i=2;i<10;i++)
{
for(int j=2;j<10;j++)
{
//外面的两层循环用于遍历棋盘上的所有点
cut=0;
a[i][j]=++cut;//放马
horse(i,j);//跑
a[i][j]=0;//跑完后擦除足迹
}
}
}
void horse(int x,int y)
{
bool resule=false;
for(int i=0;i<8;i++)//对马的八个方向进行遍历
{
if(walk(i,&x,&y))//判断该方向是否能走
{
a[x][y]=++cut;//能走 上面的walk改变x,y的值到可以走的点 a[x][y]让马踏上来
if(cut==64)//结束条件
{
print();//输出棋盘
a[x][y]=0;
cut--;
break;
}
else
{
horse(x,y);//能踏且没结束 继续前行
a[x][y]=0;//踏上去后无路可走 擦除刚才路的痕迹 继续找路
cut--;
}
}
}
}
bool walk(int index,int *x,int *y)
{
int i=*x,j=*y;
bool result=false;
switch(index)//计算马向各方向踏的坐标
{
case 0:i=i+2,j=j+1;break;
case 1:i=i+1,j=j+2;break;
case 2:i=i-1,j=j+2;break;
case 3:i=i-2,j=j+1;break;
case 4:i=i-2,j=j-1;break;
case 5:i=i-1,j=j-2;break;
case 6:i=i+1,j=j-2;break;
case 7:i=i+2,j=j-1;break;
}
if(i>1&&i<10&&j>1&&j<10&&a[i][j]==0)//判断该地方能不能踏
{ //能踏就将马移到这个位置
*x=i;
*y=j;
result=true;
}
return result;
}
void print()
{
count++;
printf("count=%ld\n",count);
for(int i=2;i<10;i++)
{
for(int j=2;j<10;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
printf("\n\n\n");
}