大致题意:
- 计算出在某个点上的马走到其他点上最少要走几步,
- 走不到的点标记为-1,走到的点标记为最少的步数,
- 马走“日”字。
基本思路
- 嗯…直接bfs一波带走就好了。
- 从原点走“日”字,到一处若没有被标记则标记上,
- bfs完的时候若是发现此点没有被标记就标记为-1。
Code:
//还是远古时期的码风...见谅
#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("
");
}//输出
return 0;
}