之前好像写过这一题,但是毕竟有点久了,之前也没有完全理解bfs,而且还是用一个数组模拟的队列。。这次复习bfs,希望自己能形成一个模板化的写法。。
#include<iostream>
#include<queue>
#include<cstring>
int m;
int sx,sy;
int ex,ey;
int visit[301][301];
int d[8][2] = {{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2}};
struct state
{
int x,y;
int step;
};
state cur,next;
int flag;
using namespace std;
void bfs(state temp)
{
queue <state> q; //创建队列
temp.step = 0; //将计步器记为0
visit[temp.x][temp.y] = 1; //标记访问
q.push(temp); //压入队列
while(!q.empty())
{
cur = q.front(); // 取出队列的头元素
if(cur.x == ex && cur.y == ey)
{
cout << cur.step << endl;
return ;
}
for(int i = 0;i < 8;i++)
{
next.x = cur.x + d[i][0];
next.y = cur.y + d[i][1];
next.step = cur.step + 1;
if(next.x<m && next.x>=0 && next.y>=0 && next.y<m && !visit[next.x][next.y]) // 满足约束条件
{
q.push(next); //压入队列
visit[next.x][next.y] = 1; // 标记访问
}
}
q.pop(); //弹出元素
}
}
int main ()
{
int n;
cin >> n;
while(n--)
{
memset(visit,0,sizeof(visit));
cin >> m;
cin >> cur.x >> cur.y;
cin >> ex >> ey;
bfs(cur);
}
return 0;
}