马踏棋盘全部解

#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");
}

猜你喜欢

转载自blog.csdn.net/qq_40279887/article/details/79561525