Total Submission(s): 4813 Accepted Submission(s): 2957
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
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.
解题思路:搜索方式不同往常的广度优先搜索,只要搞清楚方向,直接搜索即可,其他都交给计算机,你只要输条件和等结果就可以了。
由于是走‘日’字型的,则有,若当前处于中间点,则有8个方向可以走。如图,若处于‘0’点,则有8个方向可以走(‘1’点)。
#include<cstdio> #include<cstring> #include<queue> using namespace std; int map[9][9]; int n=8; int dir[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1}; //八个方向哦 char a[2][2]; int sx,sy,ex,ey; struct node { int x; int y; int step; }; bool inmap(int x,int y) { if(x>=0&&x<n&&y>=0&&y<n) return true; return false; } int bfs() { node s,e; queue<node> q; s.x=sx; s.y=sy; s.step=0; map[sx][sy]=1; q.push(s); if(sx==ex&&sy==ey) return 0; while(!q.empty()) { s=q.front(); q.pop(); for(int i=0;i<8;i++) //直接走就对了 { e.x=s.x+dir[i][0]; e.y=s.y+dir[i][1]; e.step=s.step+1; if(inmap(e.x,e.y)&&!map[e.x][e.y]) { if(e.x==ex&&e.y==ey) return e.step; map[e.x][e.y]=1; q.push(e); } } } return -1; } int main() { while(scanf("%s%s",a[0],a[1])!=EOF) { memset(map,0,sizeof(map)); sx=a[0][0]-'a'; //存储形式的转换,利于数组运用 sy=a[0][1]-'1'; ex=a[1][0]-'a'; ey=a[1][1]-'1'; printf("To get from %c%c to %c%c takes %d knight moves.\n",a[0][0],a[0][1],a[1][0],a[1][1],bfs()); } return 0; }