#include<stdio.h>
void find(int x,int y,int dep);
void output();
int check(int,int);
int n=5,m=4;
int fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},a[5][4];
int dep,x,y,count;
void main()
{
int i,j;
count=0;
dep=1;
printf("请输入x y的坐标: ");
scanf("%d%d",&x,&y);
if (x>=n||y>=m||x<0||y<0)
{
printf("输入的坐标有误,请重新输入:\n");
scanf("%d%d",&x,&y);
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
a[i][j]=0;
a[x][y]=1;
find(x,y,2);
if(count==0)
printf("No solution!\n");
else
printf("count=%d",count);
}
void find(int x,int y,int dep)
{
int i,xx,yy;
for(i=0;i<8;i++) //加上方向增量,形成新的坐标
{
xx=x+fx[i];
yy=y+fy[i];
if(check(xx,yy)==1) //判断新坐标是否出界,是否已走
{
a[xx][yy]=dep; //走向新的坐标
if(dep==n*m)
output();
else
find(xx,yy,dep+1);//从新坐标出发,递归下一层
a[xx][yy]=0;
}
}
//回溯,恢复未走标志
}
void output()
{
count++;
printf("\ncount=%d",count);
for(y=0;y<n;y++)
{
printf("\n");
for(x=0;x<m;x++)
printf("%3d ",a[y][x]);
}
printf("\n");
}
int check(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]==0)
return 1;
else
return 0;
}
回溯法求马的遍历问题
原文作者:回溯法
原文地址: https://blog.csdn.net/johnWcheung/article/details/72829062
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/johnWcheung/article/details/72829062
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。