sdau-2 1015

来源:互联网 发布:阿里云系统与安卓区别 编辑:程序博客网 时间:2024/05/16 12:03

描述:

在国际象棋中,输入起点终点,让骑士移动,求起点到终点的最短步数。

输入

e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
字母代表行,数字代表列
输出
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
思路
课件,课上讲的基础广搜,就是行变成字母了,用char数组解决。
代码
#include <stdio.h>  #include <string.h>  #include <queue>  using namespace std;    int step;  int to[8][2] = {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};int map[10][10],ex,ey;  char s1[5],s2[5];    struct node  {      int x,y,step;  };    int check(int x,int y)  {      if(x<0 || y<0 || x>=8 || y>=8 || map[x][y])      return 1;      return 0;  }    int bfs()  {      int i;      queue<node> Q;      node p,next,q;      p.x = s1[0]-'a';      p.y = s1[1]-'1';      p.step = 0;      ex = s2[0]-'a';      ey = s2[1]-'1';      memset(map,0,sizeof(map));      map[p.x][p.y] = 1;      Q.push(p);      while(!Q.empty())      {          q = Q.front();          Q.pop();          if(q.x == ex && q.y == ey)          return q.step;          for(i = 0;i<8;i++)          {              next.x = q.x+to[i][0];              next.y = q.y+to[i][1];              if(next.x == ex && next.y == ey)              return q.step+1;              if(check(next.x,next.y))              continue;              next.step = q.step+1;              map[next.x][next.y] = 1;              Q.push(next);          }      }      return 0;  }    int main()  {      while(~scanf("%s%s",s1,s2))      {          printf("To get from %s to %s takes %d knight moves.\n",s1,s2,bfs());      }      return 0;  }  


0 0