• 机器人网店


    题目描述:
    ID为TMao的淘宝用户前些日子在淘宝机器人网店购买了一个智能机器人oz.这个机器人不仅精致小巧,还具有很多有意思的功能。比如:oz可以在迷宫里自由的上下左右走动; 并且,在不碰到障碍物的情况下,它能够以最短时间从入口处走到出口 (假设存在的话); 最智能的是,在有充电器的地方oz还可以给自己充电 (^_^)。
    现在,TMao设计了很多种迷宫,并且在里面随意的摆了些充电器,想请你们帮他算下,这个智能机器人要多久时间可以走出去呢?

    他做了如下假设:

    1.迷宫可以看作是长为w,宽为h的网格;
    2.机器人每移动一步,需要时间1s,消耗电量0.5格;
    3.机器人初始电量为满格4格;
    4.每个充电器充电次数不限 (充电时间所需时间忽略不计),机器人可以反复经过一个地方,但是不能走到有障碍的地方,并且一旦机器人电量变为0,它就只能停下来,哪怕这个位置正好有充电器,它也没有足够的电量去执行充电操作;
    5.机器人走到迷宫出口,必须至少还有0.5格电量,否则也算没走出出口。

    输入:
    输入有多组测试案例,每个测试案例以如下形式输入。第一行输入w,h分别表示迷宫的长和宽,当输入0 0时结束输入(w , h <= 10)。
    接下来的h行表示迷宫的布局:-1表示该位置是障碍物, 0表示该位置什么也没有,1表示迷宫入口, 2表示迷宫出口, 3表示该位置有充电器。
    输出:
    对应每个测试案例,输出机器人oz走到出口处的时间;如果无法按要求走到出口则输出”Pity oz!”。  
    样例输入:
    4 3
    2 0 0 0
    0 0 0 0
    0 0 0 1
    4 3
    2 -1 0 0
    -1 0 0 0
    3 0 0 1
    0 0
    
    样例输出:
    5
    Pity oz!
    参考代码:
     1 #include<queue>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<string.h>
     5 using namespace std;
     6 int w, h, m, n;//w矩阵行,h为矩阵列
     7 int a[11][11];//用来分配最大内存矩阵空间
     8 int v[11][11][9];//用来标记机器人所处位置对于的电量
     9 int s[4][2] ={{ 1, 0 },{ -1, 0 },{ 0, 1 },{ 0, -1 } };//机器人移动方向“上下左右”
    10 struct robot//x,y为横纵坐标,l为长度,e为电量
    11 {
    12   int x, y, l, e;
    13  };
    14 //判断当前点是否是障碍
    15 bool judge(int x, int y)
    16 {
    17   if (x >= 1 && x <= h && y >= 1 && y <= w && a[x][y] != -1)
    18   return true19   return false;
    20 }
    21 void bfs()//深度遍历
    22 {
    23 robot k, t;
    24 int i, x, y;
    25 //初始时机器人的状态
    26 k.x = m;
    27 k.y = n;
    28 k.l = 0;
    29 k.e = 8;
    30 queue<robot> Q;
    31 Q.push(k);//入队
    32 memset(v, 0, sizeof(v));
    33 v[m][n][8] = 1;
    34 while (!Q.empty())
    35   {
    36      k = Q.front();//取队头部数据
    37       Q.pop();//出队
    38       for (i = 0; i < 4; i++)//沿四个方向遍历
    39      {
    40          x = k.x + s[i][0];
    41          y = k.y + s[i][1];
    42         if (judge(x, y) && k.e > 1)//当前结点合法,且机器电量充足
    43         {
    44          t.x = x;
    45          t.y = y;
    46          t.e = 8;
    47          t.l = k.l + 1;//遍历路径加1
    48          if (a[x][y] == 2)//找到出口,结束遍历
    49          {printf("%d
    ", k.l + 1);return; }
    50         else if (a[x][y] == 3 && !v[x][y][8])//找到充电器处,如果电量不满,进行充电
    51           {v[x][y][8] = 1; Q.push(t);}
    52          else if (a[x][y] == 0 && !v[x][y][k.e - 1])//如果是未经过路径,电量减1,同时标记该结点。
    53           { v[x][y][k.e - 1] = 1; t.e = k.e - 1; Q.push(t);}
    54         }
    55        }
    56      }
    57   printf("Pity oz!
    ");//未找到出口
    58 }
    59 
    60 void main()
    61 {
    62  int i, j;
    63   while (scanf("%d%d", &w, &h)==2)
    64    {
    65     if (!w && !h)  return;           
    66       for (i = 1; i <= h; i++)
    67         for (j = 1; j <= w; j++)
    68             {
    69                scanf("%d", &a[i][j]);
    70                 if (a[i][j] == 1)
    71                   { m = i; n = j; }
    72              }
    73        bfs();
    74     }
    75 }
  • 相关阅读:
    【散列表】拉链法以及线性探查法
    【Spring】第一个hello world程序
    『Java基础』基本数据类型和包装类
    二进制、八进制、十进制、十六进制互转
    [MyBatis]缓存机制
    Ora-01830 日期格式图片在转换整个输入字符串之前结束
    leetcode1584. 连接所有点的最小费用(最小生成树算法的应用)
    VS安装SVN插件
    Winform打开不窗体设计器解决方法(Winform以普通C#类显示,打开不了设计器)
    Oracle修改System密码并解锁
  • 原文地址:https://www.cnblogs.com/wxdjss/p/5697409.html
Copyright © 2020-2023  润新知