题目链接:http://codeforces.com/problemset/problem/589/J
题目大意:一个机器人打扫一个密闭的房间,房间由一个矩形构成,'*'表示家具,'.'表示该位置为空,机器人只能扫空的位置,给出机器人的初位置及朝向,如果当前朝向不能再继续往前走了,机器人就会向右转,问一共能清理多少地方。
例:
输入:
2 3
U..
.*.
输出:
4
解题思路:方法应该有很多种,不过我用的DFS。需要注意的就是,机器人的朝向,只有当前方有障碍时,他才会右转。还有就是DFS的结束的条件,我们可以设置一个steps变量,机器人每走一步,steps就加一,因为格子至多100格,步数大于100时就结束搜索就行了,答案就是vis标记的个数。
详情见代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//四个方向,按顺时针,上,右,下,左
6 int n,m,vis[15][15]; //vis数组标记是否扫过
7 char map[15][15];
8 int x,y,steps; //steps记录机器人所走的步数
9
10
11 void dfs(int x1,int y1,int face)
12 {
13 if(steps>100) return;
14 steps++;
15 //cout<<x1<<" "<<y1<<endl;
16 for(int i=0;i<4;i++)
17 {
18 int j=(i+face)%4; //向机器人朝向的右方转
19 int dx=x1+dir[j][0];
20 int dy=y1+dir[j][1];
21 if(dx>=0&&dx<n&&dy>=0&&dy<m&&map[dx][dy]!='*')
22 {
23 vis[dx][dy]=1;
24 dfs(dx,dy,j);
25 break;
26 }
27 }
28 return;
29 }
30
31 int main()
32 {
33 cin>>n>>m;
34 char face;
35 int ans=0;
36 steps=0;
37 for(int i=0;i<n;i++)
38 {
39 for(int j=0;j<m;j++)
40 {
41 cin>>map[i][j];
42 if(map[i][j]=='U'||map[i][j]=='R'||map[i][j]=='D'||map[i][j]=='L')
43 {
44 x=i,y=j,face=map[i][j],vis[x][y]=1;
45 }
46 }
47 }
48 //cout<<face<<endl;
49 if(face=='U') dfs(x,y,0);
50 else if(face=='R') dfs(x,y,1);
51 else if(face=='D') dfs(x,y,2);
52 else dfs(x,y,3);
53 for(int i=0;i<n;i++)
54 {
55 for(int j=0;j<m;j++)
56 {
57 if(vis[i][j]) ans++;
58 }
59 }
60 cout<<ans<<endl;
61 return 0;
62 }