洛谷P1443
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
struct Node{
int x,y;
};
int dx[9]={0,1,2,2,1,-1,-2,-2,-1};
int dy[9]={0,2,1,-1,-2,-2,-1,1,2};
/*一共八个方向,后面循环从1开始的所以多加一个
(0,0)*/
int map[1010][1010]={0},n,m;/*开了一个数组保存所有点,n和m是大小。*/
Node original;//最开始的坐标
void init(){
char c;
cin>>n>>m;
cin>>original.x>>original.y;
return;
}//输入初始化部分
void pt(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]==0){map[i][j]=-1;}
}
}
map[original.x][original.y]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%-5d",map[i][j]);
}
cout<<"\n";
}
return;
}//因为有格式要求所以用printf输出
void bfs(int x,int y){
int nx,ny,nnx,nny;
Node q[161000];/*q数组要比160000大不然存不下会出现许多-1导致错误。*/
int h=0,t=1;
q[1].x=x;q[1].y=y;//手动入队
while(h<t){
map[original.x][original.y]=-7;/*要先改变初始点的0否则会重复找初始点。*/
h++;//出队来找点
nx=q[h].x;
ny=q[h].y;
for(int i=1;i<=8;i++){
nnx=nx+dx[i];
nny=ny+dy[i];//初值加上增量
if(nnx>=1&&nnx<=n&&nny>=1&&nny<=m&&map[nnx][nny]==0){//判断越界和是否走过
map[original.x][original.y]=0;/*把初值改回来*/
map[nnx][nny]=map[nx][ny]+1;/*步数等于之前的步数加一*/
t++;
q[t].x=nnx;q[t].y=nny;
}
}
}
return;
}
void work(){
bfs(original.x,original.y);
return;
}
int main(){
init();
work();
pt();
return 0;
}
队列的题,使用了广搜的方法(gtz)