您的位置:首页 > 其它

UVA 439 - Knight Moves

2012-10-25 13:18 381 查看
这道题是一道经典的bfs,题目大意:给出一个8*8的棋盘,求出马至少需要多少步能从a位置移动到b位置;题目给出了马移动的方法,总共八个方向,用图表示如下:

只需依次访问每个节点,记录到该节点已经走过的步数,标记一下,然后不断延伸,直到不能再继续延伸,(达到边界或者周围的位置已经全部走过);或者到达目标节点,则退出搜索,代码如下: code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int move[8][2]= {{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{-1,-2},{1,-2}}; //八个可能方向
int flag[8][8]; //标记棋盘中一个点是否已经被访问过
int a1,a2,b1,b2;
struct node
{
int x,y,step; //棋盘点的坐标和步数
};
node n,p;
int bfs()
{
queue<node> q; //定义q
n.x=a1;
n.y=b1;
n.step=0;
q.push(n); //初始节点入队
flag[a1][b1]=1; //标记
while(!q.empty()) //判断队列是否为空
{
n=q.front(); q.pop(); //出队
if(n.x==a2 && n.y==b2) //判断如果找到搜索目标,则退出循环
return 1;
for(int i=0; i<8; i++) //向八方向搜索
{
int tx=n.x+move[i][0];
int ty=n.y+move[i][1];
if(tx>=0 && tx<8 && ty>=0 && ty<8 && flag[tx][ty]==0) //看是否在棋盘内和是否已经被访问过
{
p.x=tx;
p.y=ty;
p.step=n.step+1; //更新步数
q.push(p); //入队
flag[tx][ty]=1;
}
}
}
}
int main()
{
//freopen(\"in.txt\",\"r\",stdin);
//freopen(\"out.txt\",\"w\",stdout);
char a,b,c,d;
while(cin>>a>>b>>c>>d)
{
memset(flag,0,sizeof(flag));
a1=a-\'a\';
b1=b-\'1\';
a2=c-\'a\';
b2=d-\'1\';
bfs();
cout<<\"To get from \"<<a<<b<<\" to \"<<c<<d<<\" takes \"<<n.step<<\" knight moves.\\n\
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: