poj 1915 bfs(STL的queue)

题意:给你个棋盘,然后给你初始点和终点,根据规则,求初始点跳到终点的最小步数。。
思路:广搜,每扩展一层,步数加一。。用queue写的~~
#include<iostream>
#include<queue>
#define MAX 305
using namespace std;
struct point
{
  int x,y;
  int step;
};//到达的点,和需要的步数 
int dx[8]={-2,-2,-1,-1,1,1,2,2};
int dy[8]={1,-1,2,-2,2,-2,1,-1};
bool vis[MAX][MAX];
int sx,sy,ex,ey,tx,ty,L;
int bfs()
{
  memset(vis,false,sizeof(vis));//初始化 
  queue<point> Q;//定义个队列 
  point start,node;
  start.x=sx;//
  start.y=sy;//
  start.step=0;//队列初始化 
  Q.push(start);//压进队列 
  int step,x,y;
  while(!Q.empty())
  {
    start=Q.front();Q.pop();//取队列的头元素,同时把这个元素弹出 (队列从后往前进,先进的先出)
    x=start.x;
    y=start.y;
    step=start.step;//把队列头元素的x,y,step取出 
    if(x==ex&&y==ey) return step;//判断 
    for(int i=0;i<8;i++)//扩展 
    {
      tx=x+dx[i];
      ty=y+dy[i];
      if(tx>=0&&tx<L&&ty>=0&&ty<L&&!vis[tx][ty])
      {
        node.x=tx;
        node.y=ty;
        node.step=step+1;
        Q.push(node);//满足条件的进队列 
        vis[tx][ty]=true;
      }
    }
  }
}
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
      scanf("%d",&L);
      scanf("%d%d",&sx,&sy);
      scanf("%d%d",&ex,&ey);
      printf("%d\n",bfs());
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值