zoukankan      html  css  js  c++  java
  • CodeForces

    题目链接:http://codeforces.com/problemset/problem/589/J

    题意:

      有一个扫地机器人,它的起始点是在有代表方向的方格上,它的行动规则是:按照它起始点的代表方向移动,如果遇到家具(*)或者撞墙(越界)就往右转继续走(往右转了一次之后如果还是不能走就继续往右转,所以就是顺时针方向)。

    思路:

      可以用bfs,也可以用dfs。这里我用的是dfs去模拟机器人的移动。注意的一点是,它可能陷入循环的情况,但是计数是不会重复计数的。

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 char mapp[20][20];
     5 int vis[20][20];
     6 int cycle[20][20][4];     //判断是否陷入循环
     7 int n, m, ans;
     8 //顺时针方向
     9 //这里的x并不是x坐标,而是代表行,y同理代表列
    10 int dx[4] = {-1, 0, 1, 0};
    11 int dy[4] = {0, 1, 0, -1};
    12 
    13 int check(int x, int y)
    14 {
    15     if(x >= 0 && x < n && y >= 0 && y < m && mapp[x][y] == '.')
    16         return 1;
    17     return 0;
    18 }
    19 
    20 void dfs(int x, int y, int dir) //传递坐标和方向
    21 {
    22     if(cycle[x][y][dir])    //陷入循环就结束
    23     {
    24         return;
    25     }
    26     cycle[x][y][dir] = 1; //记录该点和该点时的方向,如果第二次以相同方向经过该点说明陷入了循环
    27     if(!vis[x][y])
    28     {
    29         vis[x][y] = 1;
    30         //cout << x << " " << y << endl;
    31         ans++;
    32     }
    33     int nx = x + dx[dir];
    34     int ny = y + dy[dir];
    35     if(check(nx, ny))
    36     {
    37         dfs(nx, ny, dir);
    38     }
    39     else    //越界的话还是以原来的坐标进行换方向移动
    40     {
    41         dfs(x, y, (dir + 1) % 4);
    42     }
    43 }
    44 int main()
    45 {
    46     while(cin >> n >> m)
    47     {
    48         memset(vis, 0, sizeof(vis));
    49         memset(cycle, 0, sizeof(cycle));
    50         ans = 0;
    51         for(int i = 0; i < n; i++)
    52             cin >> mapp[i];
    53         for(int i = 0; i < n; i++)
    54         {
    55             for(int j = 0; j < m; j++)
    56             {
    57                 if(mapp[i][j] == 'U')
    58                 {
    59                     mapp[i][j] = '.';
    60                     dfs(i, j, 0);
    61                 }
    62                 else if(mapp[i][j] == 'R')
    63                 {
    64                     mapp[i][j] = '.';
    65                     dfs(i, j, 1);
    66                 }
    67                 else if(mapp[i][j] == 'D')
    68                 {
    69                     mapp[i][j] = '.';
    70                     dfs(i, j, 2);
    71                 }
    72                 else if(mapp[i][j] == 'L')
    73                 {
    74                     mapp[i][j] = '.';
    75                     dfs(i, j, 3);
    76                 }
    77             }
    78         }
    79         cout << ans << endl;
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    全文本的检索
    网卡配置
    linux解压命令
    Session
    swoole安装
    Linux 系统磁盘满处理方法
    php写入和读取文件内容
    PHP读取文件夹的文件列表
    php 公历农历互相转换
    PHP实现RESTful风格的API实例
  • 原文地址:https://www.cnblogs.com/friend-A/p/9413743.html
Copyright © 2011-2022 走看看