• Red and Black (找到一个标记一个)


    题目链接:http://poj.org/problem?id=1979

    题目大意:

    有一个长方形的房间,上面铺着正方形的瓷砖。每块瓷砖都是红色或黑色的。一个男人站在一块黑色的瓷砖上。从一个瓦片,他可以移动到四个相邻瓦片中的一个。但是他不能在红瓦上移动,他只能在黑瓦上移动。

    编写一个程序,通过重复上面描述的动作来计算他可以到达的黑色方块的数量。

    输入

    输入由多个数据集组成。数据集以包含两个正整数W和H的行开始;W和H分别是x和y方向上的瓦片数。W和H不超过20。

    '.——一块黑瓷砖

    “#”——红色瓷砖

    @——一个男人在黑色的平铺上(数据集中只出现一次)

    思路:

    找到起始位置然后进行 dfs,找到一个就标记一个,然后一直走下去

    一开始自己想错了,我以为是找最多的可以走的。但是后来感觉根据题目的意思来看就是找到一条路就可以了。哭泣

    AC代码:

     1 #include <cstdio>
     2 #include <string>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <string.h>
     6 #include <math.h>
     7 #include <vector>
     8 
     9 using namespace std;
    10 
    11 const int maxn = 30;
    12 
    13 char ss[maxn][maxn];
    14 int mx[] = {0,0,1,-1};
    15 int my[] = {1,-1,0,0};
    16 int vis[maxn][maxn];
    17 int n,m;
    18 int cnt = 0;
    19 
    20 bool check(int i,int j)
    21 {
    22     if (ss[i][j] == '.' && !vis[i][j])
    23         return true;
    24     return false;
    25 }
    26 
    27 void dfs(int row,int col)
    28 {
    29     for (int i=0;i<4;i++)
    30     {
    31         int nx = row + mx[i];
    32         int ny = col + my[i];
    33         if (check(nx,ny))
    34         {
    35             cnt++;
    36             vis[nx][ny] = 1;
    37             dfs(nx,ny);
    38         }
    39     }
    40 
    41 }
    42 
    43 
    44 int main() {
    45     while (cin >> m >> n) {
    46         if (m == 0 && n == 0)
    47             return 0;
    48         bool flag = false;
    49         cnt = 0;
    50         memset(vis,0, sizeof(vis));
    51         memset(ss,'#', sizeof(ss));
    52         for (int i = 1; i <= n; i++) {
    53             for (int j = 1; j <= m; j++) {
    54                 cin >> ss[i][j];
    55             }
    56         }
    57         for (int i = 1; i <= n; i++) {
    58             for (int j = 1; j <= m; j++) {
    59                 if (ss[i][j] == '@') {
    60                     dfs(i, j);
    61                     printf("%d
    ", cnt + 1);
    62                     flag = true;
    63                     break;
    64                 }
    65             }
    66             if (flag)
    67                 break;
    68         }
    69     }
    70 }
  • 相关阅读:
    OCP 062【中文】考试题库(cuug内部资料)第29题
    413. 等差数列划分 力扣(中等) 找规律,细节
    264. 丑数 II 力扣(中等) 动态规划,不会
    313. 超级丑数 力扣(中等) 动态规划,不会做
    5840. 使字符串平衡的最小交换次数 力扣(中等) 第255场oppo周赛 猜出来的
    手写一个仿微信登录的Nodejs程序
    你不知道的CSS国际化
    React实现类似淘宝tab居中切换效果
    原来 CSS 这样写是会让 App 崩溃的
    css中class和id之间有什么区别?
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11175129.html
Copyright © 2020-2023  润新知