zoukankan      html  css  js  c++  java
  • 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 } 
  • 相关阅读:
    dotNet MSIL中的一些不常见IL指令
    DNGuard HVM Release
    让 .Net 程序 脱离 .net framework框架 运行的方法
    [转载]Calling printf from C# The tale of the hidden __arglist keyword
    浅谈.Net脱壳中方法体的局部变量签名还原
    DNGuard HVM 2007 标准版正式发布
    DNGuard HVM RC2 发布(运行库更新)
    DNGuard HVM 2007 更新[20070823]
    .Net 保护中的 native compile 方式
    gridview输出到excel
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/9403226.html
Copyright © 2011-2022 走看看