欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

搜索--20

程序员文章站 2022-05-24 08:47:27
...
题目大概:
输入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;
}

相关标签: 广度搜索 搜索