1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )

Posted tangyimin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )相关的知识,希望对你有一定的参考价值。

1021: 机器人走迷宫

时间限制: 1 Sec  内存限制: 128 MB
提交: 339  解决: 71
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱。他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走。当机器人不能走的时候,也就是下一步会遇到陷阱、迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会)。请问这个机器人最多可以经过多少个方格。

例如:

5 5

R****

*****

*****

*****

*****

机器人可以经过25个格子,但是

2 3

**L

***

机器人只能经过3个格子。

输入

对于每组数据,第一行两个数w和h,表示迷宫的行和列(1<=w,h<=10)

接下来w行每行有h个字符用于描述这个迷宫。迷宫的‘.’表示空地,即为可以走的地方。‘*’表示陷阱,即为不能走的地方。迷宫中有一个英文字母,表示机器人的出发点,字母只有’U’,’D’,’L’,’R’四种。分别表示机器人的初始指令是向上,向下,向左,向右。

输出

对于每组数据,输出一个整数,即机器人一共经过多少个方格。

样例输入

2 3
U..
.*.
4 4
R...
.**.
.**.
....

样例输出

4
12

来源/分类

 
 1 #include<iostream>
 2 
 3 using namespace std;
 4 char map[15][15];
 5 int w, h;//U’,’D’,’L’,’R’
 6 bool isCanGo(int x, int y, char d){
 7     if (d == L){
 8         if (y - 1 >= 0 && map[x][y - 1] != *)
 9             return true;
10     }
11     else if (d == R){
12         if (y + 1 < h && map[x][y + 1] != *)
13             return true;
14     }
15     else if (d == U){
16         if (x - 1 >= 0 && map[x-1][y] != *)
17             return true;
18     }
19     else if (d == D){
20         if (x + 1 < w && map[x+1][y] != *)
21             return true;
22     }
23     return false;
24 }
25 int main12313(){
26     while (cin >> w >> h){
27         char d;
28         int posx, posy;
29         for (int i = 0; i < w; i++){
30             cin >> map[i];//这里的输入太坑了,没有空格,每行就是一个输入
31             // R****  *****,注意这里的输入
32             for (int j = 0; j < h; j++){
33                 //cin >> map[i][j];
34                 if (map[i][j] == U || map[i][j] == D || map[i][j] == L || map[i][j] == R){
35                     posx = i;
36                     posy = j;
37                     d = map[i][j];
38                 }
39             }
40         }
41         int num = 1,time=1;
42         while (1){
43             if (isCanGo(posx, posy, d)){//走一步,并刷新time的值,走过格子的加一
44                 time = 1;
45                 num += 1;
46                 map[posx][posy] = *;
47                 if (d == U){
48                     posx = posx - 1;
49                 }
50                 else if (d == D){
51                     posx = posx + 1;
52                 }
53                 else if (d == L){
54                     posy -= 1;
55                 }
56                 else if (d == R){
57                     posy += 1;
58                 }
59                 //cout << posx << " " << posy << endl;
60             }
61             else if(time==1){//调整方向,time减一
62                 time--;
63                 if (d == U){
64                     d = R;
65                 }
66                 else if (d == D){
67                     d = L;
68                 }
69                 else if (d == L){
70                     d = U;
71                 }
72                 else if (d == R){
73                     d = D;
74                 }
75                 //cout << "convert!" << d << endl;
76             }
77             else{
78                 break;
79             }
80         }
81         cout << num << endl;
82     }
83     return 0;
84 }

 

以上是关于1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 Java 实现机器人走迷宫

华为机试真题 C++ 实现机器人走迷宫

华为OD机试 - 机器人走迷宫(JS)

华为OD机试Golang解题 - 机器人走迷宫

(动态规划)机器人走迷宫问题

第八届蓝桥杯(2017年)JavaA组省赛真题解析