题目大概:
输入t组数据,每组数据输入一个n,有一个n*n的矩形,一个国际象棋的马,从给定的位置出发,到达指定的位置,问最少步数是多少。
思路:
用广度优先搜索,用队列存储数据,每走一步有八种可能 ,存符合规定的位置到队列中,计算出到达指定位置的最少步数。
感想:
一个地图搜索题。
代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int x[8]={-2,-2,-1,-1,1,1,2,2},y[8]={1,-1,2,-2,2,-2,1,-1};
int map[301][301],j,n1,m1;
struct point
{int xx,yy,k;
};
queue<point>a;
int bfs(point n)
{
a.push(n);
map[n.xx][n.yy]=1;
point q,w;
while(!a.empty())
{
q=a.front();a.pop();
if(q.xx==n1&&q.yy==m1){return q.k;}
for(int i=0;i<8;i++)
{w.xx=q.xx+x[i];
w.yy=q.yy+y[i];
if(w.xx>=0&&w.yy>=0&&w.xx<j&&w.yy<j&&map[w.xx][w.yy]==0){
w.k=q.k+1;
map[w.xx][w.yy]=1;
a.push(w);
}
}
}
}
int main()
{int t;
cin>>t;
for(int i=0;i<t;i++)
{cin>>j;
memset(map,0,sizeof(map));
point n;
cin>>n.xx>>n.yy>>n1>>m1;
if(n.xx==n1&&n.yy==m1){cout<<0<<endl;continue;}
n.k=0;
while(!a.empty())a.pop();
cout<<bfs(n)<<endl;
}
return 0;
}