很简单。放道这里当BFS模板。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2005 #define inf 1<<28 using namespace std; struct kdq { int x,y; } ; queue<kdq>q; int move[8][2]= {{2,1},{2,-1},{-2,-1},{-2,1},{1,2},{1,-2},{-1,-2},{-1,2}}; bool visit[Max][Max]; int inmap(int x,int y) { if(x>=1&&y>=1&&x<=8&&y<=8) return 1; return 0; } int roadmove[Max][Max]; int bfs(int s,int e,int s1,int e1) { int i,j; kdq a; a.x=s; a.y=e; q.push(a); visit[s][e]=1; while(!q.empty()) { kdq temp=q.front(); q.pop(); for(i=0; i<8; i++) { int tx=temp.x+move[i][0]; int ty=temp.y+move[i][1]; if(inmap(tx,ty)&&!visit[tx][ty]) { roadmove[tx][ty]=roadmove[temp.x][temp.y]+1; visit[tx][ty]=1; if(tx==s1&&ty==e1) break; kdq kk; kk.x=tx; kk.y=ty; q.push(kk); } } } return roadmove[s1][e1]; } void init() { int i,j; for(i=0; i<10; i++) for(j=0; j<10; j++) roadmove[i][j]=0,visit[i][j]=0; } int main() { int i,j,k,l,n,m,x,y,e2,e1; char s1,s2; while(cin>>s1>>e1>>s2>>e2) { init(); int d1=s1-'a'+1,d2=s2-'a'+1; printf("To get from %c%d to %c%d takes %d knight moves.\n",s1,e1,s2,e2,bfs(d1,e1,d2,e2)); } return 0; }