CodeForces

题目链接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 } 
原文地址:https://www.cnblogs.com/zjl192628928/p/9403226.html