马的遍历

题目链接 https://www.luogu.com.cn/problem/P1443

又是一道bfs的模板题,和mzc男家丁那道题可以说是基本一样的,唯一不同的就是输入输出不同。

感觉我至少需要做两三道模板题才能进行更高难度的题目(bena)...

而且刚学队列需要好好熟悉一下(为自己找借口ing


放AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,sx,sy;
 4 int dis[410][410];//记录距离
 5 bool vis[410][410];//标记数组
 6 const int dx[9]={0,-2,-2,-1,1,2,2,1,-1};
 7 const int dy[9]={0,-1,1,2,2,1,-1,-2,-2};
 8 struct node
 9 {
10     int x;
11     int y;
12 };
13 int bfs(int bx,int by)
14 {
15     vis[bx][by]==true;
16     queue<node>q;
17     node start,next;
18     start.x=bx;
19     start.y=by;
20     q.push(start);
21     while(!q.empty())
22     {
23         start=q.front();
24         q.pop();
25         for(int i=1;i<=8;i++)
26         {
27             next.x=start.x+dx[i];
28             next.y=start.y+dy[i];
29             if(next.x<=0||next.x>n||next.y<=0||next.y>m)//避免越界
30                 continue;
31             if(vis[next.x][next.y]==true||(next.x==sx&&next.y==sy))
32                 continue;
33             dis[next.x][next.y]=dis[start.x][start.y]+1;
34             vis[next.x][next.y]=true;
35             q.push(next);
36         }
37     }
38     return -1;
39 }
40 int main()
41 {
42     ios::sync_with_stdio(false);//快读
43     cin>>n>>m>>sx>>sy;
44     vis[sx][sy]=true;
45     dis[sx][sy]=0;//起始点为0
46     bfs(sx,sy);
47     for(register int i=1;i<=n;i++)
48     {
49         for(register int j=1;j<=m;j++)
50         {
51             if(vis[i][j]==false) cout<<left<<setw(5)<<-1;
52             else cout<<left<<setw(5)<<dis[i][j];
53         }
54         cout<<endl;
55     }
56 }

 

posted @ 2022-03-29 19:14  爱吃虾滑  阅读(19)  评论(0编辑  收藏  举报