码迷,mamicode.com
首页 > 其他好文 > 详细

机器人网店

时间:2016-07-22 23:00:23      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:
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\n", 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!\n");//未找到出口
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 }

 

机器人网店

标签:

原文地址:http://www.cnblogs.com/wxdjss/p/5697409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!