Knight Moves

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream> 
#include <queue>  
using namespace std; 
int dx[8]={-2,-1,1,2, 2, 1,-1,-2};
int dy[8]={ 1, 2,2,1,-1,-2,-2,-1};
bool visit[50][50];
struct node{
   int x;
   int y;
   int num;
}M[2];
queue<node>Q;
bool f(int x,int y)
{
   if(x<1||x>'h'-'a'+1||y<1||y>8) 
      return false;
    return true; 
}
int bfs(node start,node end)
{
   memset(visit,false,sizeof(visit));
   while(!Q.empty())
      Q.pop();
   node head,temp;
   Q.push(start); 
   start.num=0;
   while(!Q.empty())
   {
      head=Q.front();
      if(head.x==end.x&&head.y==end.y)
        return head.num;
      for(int i=0;i<8;i++)
      {
         temp.x=head.x+dx[i];
         temp.y=head.y+dy[i];
         if(!visit[temp.x][temp.y]&&f(temp.x,temp.y))
         {
                temp.num=head.num+1;       
                Q.push(temp);
         }             
      }  
      Q.pop();  
              
   }
}
int main()
{  
    //freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    char a,b;
    int ans;
    while(scanf("%c%d %c%d\n",&a,&M[0].y,&b,&M[1].y)==4)
    {
       M[0].x=a-'a'+1;
       M[1].x=b-'a'+1;
       ans=bfs(M[0],M[1]);
       printf("To get from %c%d to %c%d takes %d knight moves.\n",a,M[0].y,b,M[1].y,ans);               
    }
    return 0;
}

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