HDU1372 Knight Moves BFS

题目大意:在一张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;
}


你可能感兴趣的:(HDU1372 Knight Moves BFS)