1330:【例8.3】最少步数

http://ybt.ssoier.cn:8088/problem_show.php?pid=1330

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int ax, ay, bx, by;
 4 struct node{           //结构体标记当前位置坐标和到该坐标步数 
 5     int x, y, step;
 6 };
 7 node que[10010];        //结构数组用于存储队列 
 8 int f, r;                //队列首尾 
 9 bool vis[105][105];    //标记坐标点是否被访问 
10 int dir[12][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-2,-2},{-2,2},{2,2},{2,-2}};
11 void bfs(int x, int y){
12     f=r=1;                                //初始化队列 
13     memset(vis, 0, sizeof(vis));        //设置vis初始化为0 
14     que[r].x=x, que[r].y=y, que[r].step=0, vis[x][y]=1;        //初始位置入队 
15     while(f<=r){
16         node t;                     //获取队首信息 
17         t.x=que[f].x;
18         t.y=que[f].y;
19         t.step=que[f].step; 
20         if(t.x==1 && t.y==1){        //如果达到目标则输出答案退出 
21             cout<<t.step<<endl;
22             break;
23         }
24         for(int i=0; i<12; i++){    //按照要求遍历马可以到达的位置 
25             int nx=t.x+dir[i][0];
26             int ny=t.y+dir[i][1];
27             if(nx>=1 && nx<=100 && ny>=1 && ny<=100 && vis[nx][ny]==0){    //判断是否越界且可以访问 
28                 vis[nx][ny]=1;
29                 r++;                //队尾后移准备入队 
30                 que[r].x=nx;
31                 que[r].y=ny;
32                 que[r].step=t.step+1;
33             }
34         }
35         f++;            //队首后移准备出队 
36     }
37 }
38 int main()
39 {
40     cin>>ax>>ay>>bx>>by;
41     bfs(ax, ay);
42     bfs(bx, by);
43     return 0;
44  } 
原文地址:https://www.cnblogs.com/tflsnoi/p/13747502.html