zoj 1091 Kniget Moves(bfs)

             确实写了几道广度优先遍历之后,这种题目很容易就可以写出来了大笑,这个题目只是让求出最短路径而已,并没有让把路径给打印出来,所以呢,是深度优先遍历中比较简单的题目啦,不过这道题目好像没有说骑士怎么走法啊,还好看了学姐的博客,和象棋里面的马走法一样,是一个‘日’字,所以呢,一共有八种情况,慢慢遍历就可以了,都这么晚了,该睡觉了,广度优先遍历就先到这吧,算是掌握了,明天开始深搜吧,继续完善自己奋斗
#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);
	}
}

你可能感兴趣的:(zoj 1091 Kniget Moves(bfs))