标签:queue code return void bit 矩阵 span namespace push
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
一行四个数据,棋盘的大小和马的坐标
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
本题思路是利用队列存储,将当前点可到达的下一个点入队以保证步数最小
#include<bits/stdc++.h> using namespace std; int n; int a,b,c,d,k[1001][1001]; int e[8]={1,2,2,1,-1,-2,-2,-1};//行行走 int f[8]={2,1,-1,-2,-2,-1,1,2};//列行走 queue <int> p;//行队列(STL大法好啊) queue <int> q;//列队列 void bfs() { p.push(c); q.push(d); k[c][d]=0; while(!q.empty()&&!p.empty()) { int o=p.front(); int w=q.front(); for(int i=0;i<=7;i++)//向八个方向试探 if(o+e[i]>=1&&o+e[i]<=a&&w+f[i]>=1&&w+f[i]<=b&&k[o+e[i]][w+f[i]]==-1) {k[o+e[i]][w+f[i]]=k[o][w]+1;//运用队列保证步数最小 p.push(o+e[i]); q.push(w+f[i]);} q.pop(); p.pop(); } } int main() { cin>>a>>b>>c>>d; memset(k,-1,sizeof(k));//不能到达就输出-1 bfs(); for(int i=1;i<=a;i++) {for(int j=1;j<=b;j++) printf("%-5d",k[i][j]);//输出格式(左对齐5格,第一次就是被这个坑了) cout<<endl;} return 0; }
标签:queue code return void bit 矩阵 span namespace push
原文地址:https://www.cnblogs.com/ln1225/p/11371406.html