zoukankan      html  css  js  c++  java
  • 抓猫_KEY

    抓猫

    题面如下:

    【 题目描述】
    流浪猫布满城市的每一个角落, 非常影响市容市貌, 作为城市聘请的抓猫者, 你有一
    种捕捉器, 一定可以捕捉到所有走到里面的猫, 更加幸运的是你有一个非常厉害的动物心理
    学家, 他可以预测猫在不同位置的行走方向(共有东、 西、 南、 北四种情况)
    为了节约经费, 问你最少需要多少个捕捉器才能把所有的猫都抓住。
    【 输入格式】
    输入第一行包含两个整数 N 和 M(1<=N,M<=1000),表示城市被划分成 N×M 的网格。接
    下来 N 行, 每行包含 M 个字符“ E”、“ W”、“ S”、“ N” 代表东、 西、 南、 北 4 个方向, 表
    示当猫在该位置的行走方向, 保证猫不会走出城市区域。
    【 输出格式】
    输出一个整数表示最少需要的捕捉器数。
    【 样例输入输出】
    D.in
    3 4
    SWWW
    SEWN
    EEEN

    D.out
    2
    【 数据说明】
    40% 1<=N,M<=4
    100% 1<=N,M<=1000
    【 样例说明】 捕鼠器放在( 3,4) 点和( 2,2) 点或( 2,3) 点。

    这道题是一道模拟题,需要用到的技巧如下:

    ·枚举 ·递归(DFS)

    从题意来看,这道题的题意就是求集合的数量;但在寻找集合的时候,需要进行集合的合并(※)。

    我解这题只需要两个数组: 一个用来存图; 一个用作判断这块区域是否走过。

    首先要解决的是如何寻找集合:

    初始化[判断数组]为 TRUE,然后枚举每个点,如果没走过就 find 一遍。

    如何实现集合的合并(find):

    你只需要在[探索区间]的时候,遇到一个已经走过的,那么可以直接退出,且ANS 不需要加一。这是因为对于当前的集合来说,已经遇到了[另一个集合]。这时,如果继续往下走,就会走与之前集合一样的路,但这两个集合是要合并的,所以没有必要继续走下去。

    code

    if(find(i,j)==0)ans++;
    
    void find(int x,int y)
    {
        if(b[x][y]!=0)
        {
            if(b[x][y]==cnt){ans++;return;}
            else return ;
        }
        b[x][y]=cnt;
        if(a[x][y]=='E')find(x,y+1);
        if(a[x][y]=='W')find(x,y-1);
        if(a[x][y]=='N')find(x-1,y);
        if(a[x][y]=='S')find(x+1,y);
    }

    时间复杂度:O(N*M)

  • 相关阅读:
    leetcode 43. 字符串相乘
    leetcode 20. 有效的括号 (python)
    leetcode 125. 验证回文串(python)
    leetcode 171. Excel表列序号(python)
    leetcode 190. 颠倒二进制位(c++)
    leetcode 122. 买卖股票的最佳时机 II (python)
    leetcode 118. 杨辉三角(python)
    leetcode 141. 环形链表(C++)
    leetcode 189. 旋转数组(python)
    leetcode 217. 存在重复元素 (python)
  • 原文地址:https://www.cnblogs.com/Cptraser/p/7593468.html
Copyright © 2011-2022 走看看