HOJ 1440 Knight Moves -------简单搜索 BFS 求l两点之间最小的到达步数
[cpp]
//题意:给定两个点的坐标,按照国际象棋中骑士的走法(有点类似于中国象棋的马踏斜日,可以向八个方向走),问最短的步子
//思路:典型搜索的题目,一般求最小的步子用BFS
//调试注意:.....
#include<iostream>
#include<queue>
#include<cstring>
#define maxlen 9
using namespace std;
int mat[maxlen][maxlen];
struct node
{
int x;
int y;
int step;
}s,e;
int dir[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
int BFS(node s,node e)
{
memset(mat,0,sizeof(mat));//每个点都可以走
queue<node> q;
node ol,ne;
while(!q.empty())
{
q.pop();
}
s.step=0;
q.push(s);
while(!q.empty())
{
ol=q.front();
q.pop();
if(ol.x==e.x&&ol.y==e.y){return ol.step;}
else
{
for(int i=0;i<8;i++)
{
ne.x=ol.x+dir[i][0];
ne.y=ol.y+dir[i][1];
ne.step=ol.step;
if(mat[ne.x][ne.y]||ne.x<1||ne.x>8||ne.y<1||ne.y>8) continue ;
else
{
mat[ne.x][ne.y]=1;
ne.step++;
q.push(ne);
}
}
}
}
return ne.step;
}
int main()
{
char m,n;
while(cin >> m >>s.y >> n >> e.y)
{
s.x=m-'a'+1;
e.x=n-'a'+1;
cout << "To get from " << m << s.y << " to " << n << e.y << " takes "<< BFS(s,e) << " knight moves."<<endl;
}
return 0;
}
补充:软件开发 , C++ ,