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.
第一次用BFS 要用到队列 很不熟练
C++的库函数里面有queue 非常好用 看来要多熟悉熟悉C++了
队列的基本用法:
queue<type> q;
1.入队:如q.push(x):将x元素接到队列的末端;
2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;
3,访问队首元素:如q.front()
4,访问队尾元素,如q.back();
5,访问队中的元素个数,如q.size();
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node { int x,y,num; }; int ax,ay,bx,by; int map[10][10]; int step[8][2]= {{-2,1},{-1,2},{1,2} ,{2,1}, {2,-1},{1,-2},{-1,-2},{-2,-1} }; char a[3],b[3]; void BFS(int x,int y); int main (void) { while(~scanf("%s%s",a,b)) { ax=a[0]-'a'+1; ay=a[1]-'0'; bx=b[0]-'a'+1; by=b[1]-'0'; BFS(ax,ay); } return 0; } void BFS(int x,int y) { node point,newpoint;//定义结构体 queue<node> q;//定义队列 point.x=x; point.y=y; point.num=0; memset(map,0,sizeof(map)); map[point.x][point.y]=1; q.push(point); while(!q.empty()) { point=q.front(); q.pop(); if(point.x==bx&&point.y==by) { printf("To get from %s to %s takes %d knight moves.\n",a,b,point.num); return; } for(int i=0; i<8; i++) { newpoint.x=point.x+step[i][0]; newpoint.y=point.y+step[i][1]; if(newpoint.x>0&&newpoint.x<9&&newpoint.y>0&&newpoint.y<9&&map[newpoint.x][newpoint.y]==0) { newpoint.num=point.num+1; q.push(newpoint); } } } }