emmm,菜鸡在这里记录一下BFS模板,给一个二逼青年,希望大家不要喷我。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
int a[400][400]/*棋盘*/,x,y,e=0,a2,b2;
int v[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}};//马的跳跃,双括号更加鲜明
typedef struct{
int x;
int y;
}ghs;//坐标结构体
ghs p,q,t;//坐标存入
void bfs(int a1,int b1)
{
p.x=a1-1;//坐标录入到结构体
p.y=b1-1;//同上
a[p.x][p.y]=e;// 貌似多余了。。
queue<ghs> w;//BFS开始,1.第一队列
w.push(p);//将所要找的点放入队列
while(w.size()!=0)//判断是否搜完
{
q=w.front();
w.pop();//取出第一个坐标
for(int z=0;z<8;z++)//寻找该点的联通点
{
t.x=q.x+v[z][0];//开始移动坐标
t.y=q.y+v[z][1];
if(t.x>=0&&t.x<x&&t.y>=0&&t.y<y&&a[t.x][t.y]==0)//符合要求
{
if(t.x!=a1-1||t.y!=b1-1)//确认不为最开始的格子
{
a[t.x][t.y]=a[q.x][q.y]+1;//标记几次到达(最短)
w.push(t);//将该点放入队列
}
}
}
}
return ;//结束
}
int main()
{
scanf("%d%d%d%d",&x,&y,&a2,&b2);
bfs(a2,b2);
for(int i=0;i<x;i++)
{for(int j=0;j<y;j++)
{
if(a[i][j]==0)// 无法到达
{
if(i!=a2-1||j!=b2-1)//不是初始点
{
a[i][j]=-1;//标记无法到达
}
}
printf("%-5d",a[i][j]);//输出
}
printf("\n");//换行
}
return 0;//结束
}