搜索--20

题目大概:
输入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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值