题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1372
这道题目是关于中国象棋的,问中国象棋里面马从一个地方跳到另一个地方最少需要多少步。
我们知道在正常范围内,马可以向8个方向跳。
简单搜索,BFS
题目代码:(代码每一步很清楚)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
/*
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
*/
int bx,by,ex,ey;
bool visit[10][10];//标记是否走过
int t[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};//8个方向
struct xh
{
int x,y,s;
}w,ww;
bool test(int x,int y)//判断
{
return x>=1&&x<=8&&y>=1&&y<=8&&visit[x][y];
}
int bfs()
{
queue<xh>q;
memset(visit,true,sizeof(visit));
w.x=bx;
w.y=by;
w.s=0;
visit[bx][by]=false;
q.push(w);
while(!q.empty())
{
ww=q.front();
q.pop();
if(ww.x==ex&&ww.y==ey)
return ww.s;
for(int i=0;i<8;i++)
{
w=ww;
w.x+=t[i][0];
w.y+=t[i][1];
if(test(w.x,w.y))
{
visit[w.x][w.y]=false;
w.s++;
q.push(w);
}
}
}
}
int main()
{
int i,j;
char s1[5],s2[5];
while(cin>>s1>>s2)
{
bx=s1[0]-'a'+1;
by=s1[1]-'0';
ex=s2[0]-'a'+1;
ey=s2[1]-'0';
printf("To get from %s to %s takes ",s1,s2);
if(s1==s2)
printf("0");
else
printf("%d",bfs());
printf(" knight moves.\n");
}
return 520;
}