显然是一道广搜模板题;
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 7 struct zkw{ 8 int x; //所在位置的横坐标 9 int y; //所在位置的纵坐标 10 int d; //已走的步数 11 }; 12 zkw w; 13 14 queue<zkw> q; // STL队列 15 16 int dx[13]={0,-2,-2,-1,1,2,2,2,2,1,-1,-2,-2}; // 共12个方向 17 int dy[13]={0,1,2,2,2,2,1,-1,-2,-2,-2,-2,-1}; 18 19 bool vis[25][25]; // 标记是否走过 20 21 void bfs(){ 22 while(!q.empty()){ 23 w=q.front(); 24 q.pop(); 25 for(int i=0;i<13;++i){ //枚举所走的方向 26 int xx=w.x+dx[i],yy=w.y+dy[i]; 27 if(xx==1 && yy==1){ //若符合要求,停止索索,输出答案 28 printf("%d",w.d+1); 29 return; 30 } 31 if(xx>=1 && xx<=20 && yy>=1 && yy<=20 && !vis[xx][yy]){ // 继续搜索 32 vis[xx][yy]=true; 33 q.push((zkw){xx,yy,w.d+1}); 34 } 35 } 36 } 37 } 38 39 int main(){ 40 int x,y,a,b; 41 scanf("%d%d%d%d",&x,&y,&a,&b); 42 q.push((zkw){x,y,0}); 43 vis[x][y]=true; 44 bfs(); 45 printf(" "); 46 memset(vis,0,sizeof(vis)); //清空 47 vis[a][b]=true; 48 while(!q.empty()){ // 清空队列,为下一次搜索做准备 49 q.pop(); 50 } 51 w=(zkw){0,0,0}; 52 q.push((zkw){a,b,0}); 53 bfs(); 54 return 0; 55 }