题目地址:点击打开链接
跟象棋中马一样的走法,BFS遍历
C++代码:
#include <iostream>
#include <string>
#include <cstring>
#include <deque>
#include <utility>
using namespace std;
const int maxsize = 10;
int visited[maxsize][maxsize];
int num[maxsize][maxsize];
int d[8][2]={-1,2,-1,-2,1,2,1,-2,2,-1,2,1,-2,-1,-2,1};
int main()
{
string a,b;
while(cin>>a>>b)
{
int start_x=a[0]-'a';
int start_y=a[1]-'1';
int end_x=b[0]-'a';
int end_y=b[1]-'1';
memset(visited,0,sizeof(visited));
memset(num,0,sizeof(num));
visited[start_x][start_y]=1;
deque<pair<int,int> > dp;
dp.push_back(make_pair(start_x,start_y));
while(!dp.empty()&&(dp.front().first!=end_x||dp.front().second!=end_y))
{
int a=dp.front().first;
int b=dp.front().second;
dp.pop_front();
for(int i=0;i<8;++i)
{
int x=a+d[i][0];
int y=b+d[i][1];
if(x>=0&&x<8&&y>=0&&y<8&&!visited[x][y])
{
visited[x][y]=1;
num[x][y]=num[a][b]+1;
dp.push_back(make_pair(x,y));
}
}
}
cout<<"To get from "<<a<<" to "<<b<<" takes "<<num[end_x][end_y]<<" knight moves."<<endl;
}
return 0;
}