标签:lan 输出 超出 step queue 思路 using 啊啊啊 while
//还是远古时期的码风...见谅
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
queue<int> a,b,step;
int n,m;
int k[410][410];
int pd[410][410];
int ax,ay;
int dx[8]={-2,-2,-1,-1,1,1,2,2};//若(x,y)为现在马所在的点,
int dy[8]={-1,1,-2,2,-2,2,-1,1};//则(x+dx[0~7],y+dy[0~7])为现在马能去的点
void bfs(int idx,int idy){//还是bfs的基础模板啊啊啊
a.push(idx);
b.push(idy);
step.push(0);//进队列
pd[idx][idy]=1;//标记原点已经来过
while(!a.empty()){
for(int i=0;i<8;++i){//便利能去的点
int x=a.front()+dx[i];//记录能去的点
int y=b.front()+dy[i];
int step_=step.front();//记录去那个点要花的步数
if(pd[x][y]==0){//若那个点没去过
if(x>=0&&x<n&&y>=0&&y<m){//且若那个点没有超出边界
a.push(x);
b.push(y);
step.push(step_+1);//进队列
k[x][y]=step_+1;//记录步数
pd[x][y]=1;//标记来过
}
}
}
a.pop();
b.pop();
step.pop();//出队列
}
}
int main(){
cin>>n>>m>>ax>>ay;
bfs(--ax,--ay);
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(k[i][j]==0)k[i][j]=-1;
}
}//找出没有去过的点标记为-1
k[ax][ay]=0;//原点不能是-1,再标记回来
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
printf("%-5d",k[i][j]);
}
printf("\n");
}//输出
return 0;
}
标签:lan 输出 超出 step queue 思路 using 啊啊啊 while
原文地址:https://www.cnblogs.com/FUXyao/p/12885403.html