这题其实就是一个变种的宽搜,很简单,可是后来发现自己把宽搜和深搜给记反了,这题就一直写的是深搜,
但是显然宽搜的题用深搜做事不对的,也学可以,反正本弱不会,但是前面几个深搜的题目,我都是用宽搜
做的,事实证明深搜的题目是可以用宽搜来做的,而深搜和宽搜的最主要区别就是深搜用栈来实现,而宽搜用
队列来实现,然后想象一下栈和队列的调用过程,很简单就可以知道深搜和宽搜的区别。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#include<algorithm>
#include<sstream>
#define LL long long
using namespace std;
struct node
{
int x,y;
node(int x,int y):x(x),y(y) {};
};
int dx[8]={-2,-1,-1,-2,1,2,1,2},dy[8]={-1,-2,2,1,-2,-1,2,1};
int grid[10][10],vis[10][10];
int d[10][10];
//int pos;
int rx,ry;
char b1,b2;
int a1,a2;
void bfs(node u)
{
int flag=0;
queue<node> q;
q.push(u);
while(!q.empty())
{
node dd=q.front();
int x=dd.x;
int y=dd.y;
if(x==rx&&y==ry) {return;}
q.pop();
for(int i=0;i<8;i++)
{
int ax=x+dx[i];
int ay=y+dy[i];
if(ax>0&&ax<=8&&ay>0&&ay<=8&&vis[ax][ay]==0)
{
vis[ax][ay]=1;
d[ax][ay]=d[x][y]+1;
if(x==rx&&y==ry) {return;}
// cout<<ax<<' '<<ay<<endl;
q.push(node(ax,ay));
}
}
}
}
int main()
{
while(scanf("%c%d %c%d",&b1,&a1,&b2,&a2)!=EOF)
{
getchar();
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
rx=a2;
ry=b2-'a'+1;
//pos=0;
// cout<<rx<<' '<<ry<<' '<<a1<<' '<<(int)(b1-'a'+1)<<endl;
vis[a1][(b1-'a'+1)]=1;
bfs(node(a1,(int)(b1-'a'+1)));
printf("To get from %c%d to %c%d takes %d knight moves.\n",b1,a1,b2,a2,d[rx][ry]);
}
return 0;
}