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 }

猜你喜欢

转载自www.cnblogs.com/tangyimin/p/10580698.html
今日推荐