UVA 439 Knight Moves

题目:

  给出国际象棋棋盘中的两个点,求马从一个点跳到另一个点的最少步数。

分析:

  搜索、最短路。利用bfs去接即可。

代码:

  

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <fstream>
using namespace std;
#define maxn 8
char m[2][5];
int step[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
int x1,y1,x2,y2;
int vis[8][8];
int a[1000];
int num[1000];
int bfs(int x,int y)
{
int front=0,rear=0;
a[front++]=x*8+y;
vis[x][y]=1;
while(front>rear)
{
x=a[rear]/8;
y=a[rear]%8;
if(x==x2&&y==y2)
return num[rear];
for(int i=0;i<8;i++)
{
int nx=x+step[i][0];
int ny=y+step[i][1];
if(nx>=0&&ny>=0&&nx<8&&ny<8&&vis[nx][ny]==0)
{
vis[nx][ny]=1;
a[front]=nx*8+ny;
num[front++]=num[rear]+1;
}
}
rear++;
}
}
int main()
{
while(cin>>m[0]>>m[1])
{
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
x1=m[0][1]-'1';
y1=m[0][0]-'a';
x2=m[1][1]-'1';
y2=m[1][0]-'a';
int l=bfs(x1,y1);
cout<<"To get from "<<m[0]<<" to "<<m[1]<<" takes "<<l<<" knight moves."<<endl;
}
}
posted @ 2015-10-15 12:56  幻世沉溺  阅读(140)  评论(0编辑  收藏  举报