确实写了几道广度优先遍历之后,这种题目很容易就可以写出来了
,这个题目只是让求出最短路径而已,并没有让把路径给打印出来,所以呢,是深度优先遍历中比较简单的题目啦,不过这道题目好像没有说骑士怎么走法啊,还好看了学姐的博客,和象棋里面的马走法一样,是一个‘日’字,所以呢,一共有八种情况,慢慢遍历就可以了,都这么晚了,该睡觉了,广度优先遍历就先到这吧,算是掌握了,明天开始深搜吧,继续完善自己
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
int map[10][10];
int visit[10][10];
int dist[10][10];
typedef struct
{
int i,j;
}node;
int bfs(int x1,int y1,int x2,int y2)
{
node t,w;
t.i=x1;
t.j=y1;
dist[x1][y1]=0;
visit[x1][y1]=1;
int k;
queue<node>q;
q.push(t);
int step[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
while(!q.empty())
{
t=q.front();
q.pop();
if(t.i==x2&&t.j==y2)
return dist[t.i][t.j];
else
{
for(k=0;k<8;k++)
{
w.i=t.i+step[k][0];
w.j=t.j+step[k][1];
if(w.i>0&&w.j>0&&w.i<=8&&w.j<=8&&!visit[w.i][w.j])
{
q.push(w);
dist[w.i][w.j]=dist[t.i][t.j]+1;
visit[w.i][w.j]=1;
}
}
}
}
}
int main()
{
int i,j,x1,y1,x2,y2;
char m,n,p;
while(scanf("%c%d%c%c%d",&m,&x1,&p,&n,&x2)!=EOF)
{
getchar();
memset(visit,0,sizeof(visit));
memset(dist,0,sizeof(dist));
int y1=m-'a'+1;
int y2=n-'a'+1;
int ans=bfs(x1,y1,x2,y2);
printf("To get from %c%d to %c%d takes %d knight moves.\n",m,x1,n,x2,ans);
}
}