#include <stdio.h>
#include <stdlib.h>
#define N 4
static int count;
void print_line() //分割线
{
printf("\n\n-------------------------------------------------------\n\n");
}
int judge(int *a,int x1,int x2,int y2,int m)
{
if(x1>x2-1||(x1==x2-1&&a[x1]!=y2)||a[x1]<1||a[x1]>m)
return 0;
return 1;
}
void print_map(int *a,int m,int n,int x2) //打印棋盘
{
int i,j,k;
count++;
print_line();
printf("路线%d:\n\n",count);
for(i=m;i>=1;i--)
{
if(i==m)
{
for(k=1;k<=n;k++)
printf(k+1>=10?"%-3d":"%-4d",k);
puts("");
}
for(j=0;j<n;j++)
{
if(j==0)
printf(a[j]!=i||j>x2-1?"+":"O");
else
if(j==n-1)
printf(a[j]!=i||j>x2-1?"---+":"---O");
else
printf(a[j]!=i||j>x2-1?"---+":"---O");
}
if(i>=2)
{
puts("");
for(k=0;k<n-1;k++)
printf("| ");
printf("|\n");
}
}
}
void think(int *a,int x1,int x2,int y2,int m,int n)
{
int i;
if(a[x1]==y2&&x1==x2-1) //状态搜索树遍历到叶子结点打印棋盘
print_map(a,m,n,x2);
else
{
for(i=0;i<N;i++)
{
switch(i) //马要走的方向
{
case 0:x1++;a[x1]=a[x1-1]+2;break;
case 1:x1+=2;a[x1]=a[x1-2]+1;break;
case 2:x1+=2;a[x1]=a[x1-2]-1;break;
case 3:x1++;a[x1]=a[x1-1]-2;break;
}
if(judge(a,x1,x2,y2,m))
think(a,x1,x2,y2,m,n);
switch(i) //返回,继续遍历
{
case 0:a[x1]=a[x1-1]-2;x1--;break;
case 1:a[x1]=a[x1-2]-1;x1-=2;break;
case 2:a[x1]=a[x1-2]+1;x1-=2;break;
case 3:a[x1]=a[x1-1]+2;x1--;break;
}
}
}
}
int main()
{
int x1,y1,x2,y2,m,n;
int i,*a;
char key;
do
{
count=0;
print_line();
printf("请输入n,m:");
scanf("%d%d",&n,&m);
print_line();
printf("请输入起点坐标:");
scanf("%d%d",&x1,&y1);
print_line();
printf("请输入终点坐标:");
scanf("%d%d",&x2,&y2);
a=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
a[i]=0;
a[x1-1]=y1;
think(a,x1-1,x2,y2,m,n);
print_line();
printf("共有%d条路线!",count);
print_line();
printf("是否继续计算:[ ]\b\b");
fflush(stdin);
scanf("%c",&key);
}while(key=='Y'||key=='y');
return 0;
}
最近对状态搜索树,dfs的应用很感兴趣,还要继续加强学习!