广度优先搜索( 图 BFS)练手题

  1.                                                               追赶妖怪

    Description

    一身正气的钟馗四处降妖,一天他发现一只狐妖正在祸害百姓,他连忙追赶上去准备除妖,可是狐妖很聪明,她自知敌不过钟馗,便逃入山林,企图消耗钟馗的体力。钟馗在树林里面可以自由移动,而且他有一个法术:可以从当前坐标(x,y)直接移动到(2x,2y)的位置。钟馗为了不枉送性命,找到人称"人间诸葛亮"的你,希望你能帮他判断他能否在体力未耗尽到达狐妖的藏匿地点(如果到达狐妖藏身之处还剩余0点体力也是可以的)。
    注意:钟馗一开始拥有n点体力,每次普通移动或者使用法术移动会消耗1点体力值,当体力消耗完毕(n<=0)便无法再进行移动。
    现在给钟馗移动方式一个规定:
    a.如果钟馗不使用法术,他可以从(x,y)移动到(x-1,y),(x+1,y),(x,y-1),(x,y+1)中的任意一个位置.
    b.如果钟馗使用法术,他可以从当前坐标(x,y)直接移动到(2x,2y)的位置.

    Input

    输入包含3行。

    第一行包含一个数字n,表示钟馗的初始体力值。1<n<=500

    第二行两个整数表示钟馗初始坐标。

    第三行两个整数表示狐妖藏匿坐标。

    注意:狐妖不会移动。树林可以看做一个矩形,四个角的坐标分别为(0,0),(0,500),(500,0),(500,500)。钟馗移动的位置不能超出树林的范围。

    Output

    输出只有一行。

    如果钟馗能够到达狐妖藏匿位置输出"YES",如果钟馗无法到达狐妖藏匿位置输出"NO"

    Sample Input

    50
    4 4
    9 9
    5
    0 0
    0 5
    1
    0 0
    1 0
    1
    0 0
    2 2
    1
    0 0
    500 500
    

    Sample Output

    YES
    YES
    YES
    NO
    NO

    程序如下:
  2. #include<cstdio>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstring>
  6. using namespace std;
  7. const int maxn=500+10;
  8. struct note{
  9.     int x,y;
  10.     note(int x1=0,int y1=0):x(x1),y(y1){}
  11.     };
  12.     note n2;
  13.     int X,Y,N;
  14. int d[maxn][maxn];           //记录初始位置到当前位置走过的步数
  15. int dir[][2]={{1,0},{-1,0},{0,-1},{0,1},{X,Y}};
  16. void print(note u){
  17.         if(d[u.x][u.y]>N)printf("NO\n");
  18.         else printf("YES\n");
  19. }

  20. bool isValid(const note &v){
  21.     return v.x>=0 && v.x<=500 && v.y>=0 &&v.y<=500;
  22. }
  23. void bfs(){
  24.     queue<note>q;
  25.     q.push(note(X,Y));
  26.     while(!q.empty()){
  27.         note u=q.front();q.pop();
  28.         if(u.x==n2.x && u.y==n2.y){
  29.             print(u);
  30.             return ; 
  31.         }
  32.         X=u.x;Y=u.y;
  33.         for(int i=0;i<5;i++){
  34.             note v;
  35.             if(i<4)v=note(u.x+dir[i][0],u.y+dir[i][1]);
  36.             else v=note(X*2,Y*2);
  37.             if(isValid(v) && d[v.x][v.y]==0){
  38.                 d[v.x][v.y]=d[u.x][u.y]+1;
  39.                 q.push(v);
  40.             }
  41.         }
  42.     }
  43. }
  44. int main(){
  45.     while(scanf("%d",&N)==1){
  46.     scanf("%d%d",&X,&Y);
  47.     scanf("%d%d",&n2.x,&n2.y);
  48.     memset(d,0,sizeof(d));
  49.     bfs();
  50.         }
  51.     return 0;
  52. }

本题不需要记录路径,是一道相对简单的BFS类型题目。如果对广度优先搜索(BFS)不是很熟悉的话可以访问 http://rapheal.iteye.com/blog/1526861  这个网址,感觉写的不错。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值