uva 439 Knight Moves

很简单的骑士周游问题,简单的BFS

一个骑士在当前位置的话可以像8个方向走,至于骑士是怎么走的可以百度一下

记录起点和终点的行列并算出它的标号(整个棋盘是8*8的,按行优先去编号从1到64,所以每个格子都会有一个唯一的编号)

走了8个方向记录下每个方向的编号,每得到一个编号就判断和终点编号是否相同,是的话就已经走到了,跳出,否则的话这个格子入队

另外就是记录步数,就是代码中的k

另外要注意判断起点和终点相同的情况,都是输出0

 

#include <stdio.h>

#include <string.h>

#include <queue>

#define MAX 70

using namespace std;

bool vis[70];

int START,END;

char s[10];

struct node

{int num,r,c,k;};

queue<struct node> q;



void BFS()

{

    int i,k,R[9],C[9];

    struct node tmp;



    while(!q.empty()) q.pop();

    tmp.num=START; tmp.k=0;

    tmp.r = ((START%8)==0) ? (START/8) : (START/8+1) ;

    tmp.c = ((START%8)==0) ? 8 : START%8 ;

    q.push(tmp);   //初始化把起点入队

    if(tmp.num==END) q.pop();

    while(!q.empty())  //这个判断可以省去

    {

        tmp=q.front(); q.pop(); //出队一个元素

        k=tmp.k;

        R[1]=tmp.r-2;  C[1]=tmp.c-1;   

        R[2]=tmp.r-2;  C[2]=tmp.c+1;

        R[3]=tmp.r-1;  C[3]=tmp.c+2;

        R[4]=tmp.r+1;  C[4]=tmp.c+2;

        R[5]=tmp.r+2;  C[5]=tmp.c+1;

        R[6]=tmp.r+2;  C[6]=tmp.c-1;

        R[7]=tmp.r+1;  C[7]=tmp.c-2;

        R[8]=tmp.r-1;  C[8]=tmp.c-2;



        for(i=1; i<=8; i++)

        {

            if(R[i]>=1 && R[i]<=8 && C[i]>=1 && C[i]<=8)

            {

                tmp.r=R[i]; tmp.c=C[i]; tmp.k=k+1;

                tmp.num=(tmp.r-1)*8+tmp.c;

                q.push(tmp);   //入队

                if(tmp.num==END)  break;

            }

        }



        if(i<=8)  break;



    }

    printf("To get from %c%c to %c%c takes %d knight moves.\n",s[0],s[1],s[3],s[4],tmp.k);



    return ;



}

int main()

{

    int r,c;

    while(gets(s))

    {

        c=s[0]-'a'+1;  r=s[1]-'0';

        START=8*(r-1)+c;

        c=s[3]-'a'+1;  r=s[4]-'0';

        END=8*(r-1)+c;



        BFS();

    }

    return 0;

}

你可能感兴趣的:(move)