属于比较水的广搜。。第一个是纯C 自己写的队列。。。第二个C++ STL的队列。。 #include <stdio.h> #include <string.h> #define MAXN 100000 int xx[]={-2,-1,-2,-1,1,2,+1,+2}; int yy[]={-1,-2,+1,+2,2,1,-2,-1}; char tmp1[3],tmp2[3]; int count; int visit[10][10]; int i; struct lab{ int x; int y; int step; }; struct lab f,t; struct lab q[MAXN]; struct lab tmp,tmp_q; int front=0,rear=0; int result; void push(struct lab k) { q[rear++] = k; } void pop() { front++; } void init() { f.x=tmp1[0]-'a'+1; f.y = tmp1[1]-'0'; t.x=tmp2[0]-'a'+1; t.y = tmp2[1]-'0'; memset(visit,0,sizeof(visit)); front = rear = 0; } void bfs(int x,int y) { tmp.x = x; tmp.y = y; tmp.step = 0; push(tmp); while (front<=rear) { tmp = q[front]; /*printf("into%d/n",tmp.step); printf("%d %d/n",tmp.x,tmp.y);*/ pop(); tmp_q = tmp; if(tmp.x==t.x&&tmp.y==t.y) { /*printf("success/n");*/ result = tmp.step; return ; } for(i=0;i<8;i++) { tmp.x=tmp_q.x+xx[i]; tmp.y=tmp_q.y+yy[i]; tmp.step=tmp_q.step+1; if(tmp.x<9&&tmp.x>0&&tmp.y<9&&tmp.y>0&&!visit[tmp.x][tmp.y]) { visit[tmp.x][tmp.y]=1; push(tmp); } } } } int main(void) { while (scanf("%s %s",tmp1,tmp2)!=EOF) { init(); /*printf("%d %d %d %d/n",f.x,f.y,t.x,t.y);*/ bfs(f.x,f.y); printf("To get from %s to %s takes %d knight moves./n",tmp1,tmp2,result); } return 0; } STL版 #include <stdio.h> #include <string.h> #include <iostream> #include <queue> using namespace std; int xx[]={-2,-1,-2,-1,1,2,+1,+2}; int yy[]={-1,-2,+1,+2,2,1,-2,-1}; int visit[10][10]; struct lab { int x; int y; int step; }p[2],tmp,tmp1; int result; queue <lab> q; void bfs(char x, int y) { tmp.x = x; tmp.y = y; tmp.step = 0; q.push(tmp); while(!q.empty()) { //printf("fds/n"); tmp = q.front(); q.pop(); tmp1.x=tmp.x; tmp1.y=tmp.y; tmp1.step =tmp.step; if(tmp.x==p[1].x&&tmp.y==p[1].y) { result = tmp1.step; //printf("result=%d/n",result); return ; } for(int i=0;i<8;i++) { tmp.x = tmp1.x + xx[i]; tmp.y = tmp1.y + yy[i]; tmp.step = tmp1.step+1; if(tmp.x<9&&tmp.x>0&&tmp.y<9&&tmp.y>0&&!visit[tmp.x][tmp.y]) { visit[tmp.x][tmp.y]=1; q.push(tmp); //printf("step=%d/n",tmp.step); } } } /*if(x<'a'||x>'h'||y<1||y>8) return ;*/ /* if(x==p[1].x&&y==p[1].y) { printf("%d/n",count); return ; }*/ } int main(void) { //int h_f,h_t,x_f,x_t; //from to 横竖。 上下左右 //char h_t, char waste,tmp11,tmp22; while(scanf("%c%d%c%c%d",&tmp11,&p[0].y,&waste,&tmp22,&p[1].y)!=EOF) { p[0].x = tmp11-'a'+1; p[1].x = tmp22-'a'+1; //printf("%d/n",result); memset(visit,0,sizeof(visit)); while(!q.empty()) q.pop(); //int front=0,rear=0; //printf("%d/n",result); bfs(p[0].x,p[0].y); //To get from e2 to e4 takes 2 knight moves. printf("To get from %c%d to %c%d takes %d knight moves./n",tmp11,p[0].y,tmp22,p[1].y,result); //printf("%d/n",result); //printf("...%d %d %d %d/n",p[0].x,p[0].y,p[1].x,p[1].y); getchar(); } return 0; }