马的遍历
题目链接 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 }