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;
}
posted @ 2012-10-24 09:55  Titanium  阅读(687)  评论(0编辑  收藏  举报