uva 439 Knight Moves

题目链接

题目大意:一个8*8的棋盘,行(1~8)列(a~h)

                                           求从起点到终点的最小 马步 数


题目分析:简单的bfs,将字符转为数字,做坐标,8个方向


注意事项:行减‘1’不是‘0’,列减‘a';

                 开始时将队列清空

                 将访问数组清空

                 每句话后有一个点(.)

                 注意细节(因为把"a.t+1"打成了"a.x+1",找了一个多小时bug大哭

#include <cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char shi[5];//始点
char zhong[5];  //终点
int f;             //最短路径
bool v[10][10];    //访问标记
int z[8][2]={  {2,1},{1,2}, {1,-2},{2,-1},{-1,2},{-2,1}  ,{-1,-2},{-2,-1}}   ;       //8个坐标
struct node
{
    int x;
    int y;
    int t;
};
queue <node> aa;

void bfs()
{
    while(!aa.empty())
    {
        node a=aa.front();
        aa.pop();
        if(a.x==zhong[1]-'1'&&a.y==zhong[0]-'a')
      {
        f=a.t;
        return;
      }
      for(int i=0;i<8;++i)
      {
          int nx=a.x+z[i][0];
        int ny=a.y+z[i][1];
        if(nx>=0&&ny>=0&&nx<8&&ny<8&&!v[nx][ny])
        {
           node q={nx,ny,a.t+1};
           v[nx][ny]=1;
            aa.push(q);
        }
      }
    }
}
int main()
{
    while(cin>>shi>>zhong)
    {
        while(!aa.empty())
            aa.pop();
        memset(v,0,sizeof(v));
        node a={shi[1]-'1',shi[0]-'a',0};
        aa.push(a);
        v[shi[1]-'1'][shi[0]-'a']=1;
        bfs();
        cout<<"To get from "<<shi<<" to "<<zhong<<" takes "<<f<<" knight moves."<<endl;
    }
   return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值