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 }