HDU1372 Knight Moves BFS

来源:互联网 发布:java怎么求最小公倍数 编辑:程序博客网 时间:2024/05/17 08:42

题目大意:在一张8×8的国际象棋棋盘上(其中纵坐标用a-h表示,横坐标用1-8表示),给你一枚骑士的起点坐标和要到达的终点坐标,让你求出骑士要走的最小步数。

分析:其实这道题的难点就在于很多人并不知道骑士是怎么移动的,其实国际象棋中的其实相当于中国象棋中的马,他的移动轨迹的“日”字形的,只是少了中国象棋中的“蹩马腿”这一说。知道了这一点,这道题就简单多了,很水的一道BFS题目。

实现代码如下:

#include <cstdio>#include <iostream>#include <cstring>using namespace std;bool s[10][10];int dir[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};typedef struct node{    int x,y,tmp;}point;point que[100];int sx,sy,ex,ey;void bfs(){    int cmp1=1,cmp2=1;    int x,y;    que[cmp1].x=sx;    que[cmp1].y=sy;    que[cmp1].tmp=0;    s[sx][sy]=true;    while(cmp1<=cmp2&&!s[ex][ey])    {        for(int i=0;i<8;i++)        {            x=que[cmp1].x+dir[i][0];            y=que[cmp1].y+dir[i][1];            if(x<=8&&x>0&&y<=8&&y>0&&!s[x][y])            {                cmp2++;                que[cmp2].x=x;                que[cmp2].y=y;                que[cmp2].tmp=que[cmp1].tmp+1;                s[x][y]=true;            }        }        cmp1++;    }    printf("%d knight moves.\n",que[cmp2].tmp);}int main(){    char a,b;    int c,d;    while(cin>>a>>c>>b>>d)    {        memset(s,false,sizeof(s));        sx=a-'a'+1;        sy=c;        ex=b-'a'+1;        ey=d;        printf("To get from %c%d to %c%d takes ",a,c,b,d);        bfs();    }    return 0;}


0 0