uva 439 - Knight Moves

来源:互联网 发布:2017年6月进出口数据 编辑:程序博客网 时间:2024/05/20 12:24

给定起点和终点,最少需要几步才能走到。骑士按照马的走法。

简单的bfs。

#include<cstdio>#include<cstring>#include<queue>using namespace std;const int MAXN=128;typedef struct{    char a[3];    int time;}solve;solve d1,d2;int dx[]={-1,-2,-2,-1,1,1,2,2};int dy[]={-2,-1,1,2,2,-2,-1,1};char temp1[3],temp2[3];bool vis[MAXN][MAXN];bool limit(char a,char b){    if(a>='a' && a<='h' && b>='1' && b<='8') return true;    else return false;}void bfs(){    queue<solve>q;    while(!q.empty()) q.pop();    q.push(d1);    vis[d1.a[0]][d1.a[1]]=true;    while(!q.empty()){        d2=q.front();        //printf("%c%c\n",d2.a[0],d2.a[1]);        if(d2.a[0]==temp2[0] && d2.a[1]==temp2[1]){            printf("To get from %s to %s takes %d knight moves.\n",temp1,temp2,d2.time);            return ;        }        for(int i=0;i<8;i++){            d1.a[0]=d2.a[0]+dx[i];            d1.a[1]=d2.a[1]+dy[i];            d1.time=d2.time+1;            if(limit(d1.a[0],d1.a[1]) && !vis[d1.a[0]][d1.a[1]]){                q.push(d1);                vis[d1.a[0]][d1.a[1]]=true;            }        }        q.pop();    }}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%s%s",temp1,temp2)){        memset(vis,false,sizeof(vis));        d1.a[0]=temp1[0];        d1.a[1]=temp1[1];        d1.time=0;        bfs();    }    return 0;}


 

0 0
原创粉丝点击