959. 由斜杠划分区域

在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /\ 或空格构成。这些字符会将方块划分为一些共边的区域。

(请注意,反斜杠字符是转义的,因此 \ 用 "\\" 表示。)。

返回区域的数目。

 

示例 1:

输入:
[
  " /",
  "/ "
]
输出:2
解释:2x2 网格如下:

示例 2:

输入:
[
  " /",
  "  "
]
输出:1
解释:2x2 网格如下:

示例 3:

输入:
[
  "\\/",
  "/\\"
]
输出:4
解释:(回想一下,因为 \ 字符是转义的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。)
2x2 网格如下:

示例 4:

输入:
[
  "/\\",
  "\\/"
]
输出:5
解释:(回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。)
2x2 网格如下:

示例 5:

输入:
[
  "//",
  "/ "
]
输出:3
解释:2x2 网格如下:

 

提示:

  1. 1 <= grid.length == grid[0].length <= 30
  2. grid[i][j] 是 '/''\'、或 ' '

 

思路:这实际是一个岛屿个数的问题。将输入的string表达式所代表的网格扩大三倍,如下图。其中右下图为扩大后的图,黑色部分表示原始的/或者\。对扩大后的图进行dfs得到最终的结果。

class Solution {
public:
    void dfs(vector<vector<int> > &nums, int i, int j){
        if(i>=0 && j>=0 && i<nums.size() && j<nums.size() && !nums[i][j]){
            nums[i][j]=1;
            dfs(nums, i-1, j);
            dfs(nums, i, j-1);
            dfs(nums, i, j+1);
            dfs(nums, i+1, j);
        }
    }

    int regionsBySlashes(vector<string>& grid) {
        int n=grid.size(), re=0;
        vector<vector<int> >nums(3*n, vector<int>(3*n));
        //将原始网格扩大三倍
        for(int i=0; i<n; ++i){
            for(int j=0; j<n; ++j){
                if(grid[i][j]=='/'){
                    nums[i*3][j*3+2]=nums[i*3+1][j*3+1]=nums[i*3+2][j*3]=1;
                }
                if(grid[i][j]=='\\'){
                    nums[i*3][j*3]=nums[i*3+1][j*3+1]=nums[i*3+2][j*3+2]=1;
                }
            }
        }
        for(int i=0; i<3*n; ++i){
            for(int j=0; j<3*n; ++j){
                if(!nums[i][j]){
                    dfs(nums, i, j);//只要遇到0的网格,把它和它周围所有相邻的0都置为1,并且得到一个区域。
                    re++;
                }
            }
        }
        return re;
    }
};

 

资源下载链接为: https://pan.quark.cn/s/72147cbc453d 在当今信息化时代,高校社团管理的高效性与便捷性至关重要。基于 Spring Boot 开发的社团管理系统,致力于打造一个功能全面、操作便捷且安全可靠的平台,以满足高校社团的日常运营需。本文将深入剖析该系统的架构设计、核心功能以及实现原理。 Spring Boot 以其轻量级和快速开发的特性,成为众多企业级应用的首选框架。本社团管理系统采用 Spring Boot 搭建,并遵循 RESTful API 设计原则,构建出一个松耦合、模块化的架构。借助 Spring Boot 的自动配置功能,项目初始化工作得以大幅简化,使开发者能够更加专注于业务逻辑的开发。 权限管理是系统安全的关键环节。本系统引入多级权限控制机制,确保不同角色(如管理员、普通成员等)能够访问其对应的系统功能。通常会借助 Spring Security 或 Apache Shiro 等安全框架,通过角色、权限与资源的映射关系,实现对用户操作的精细化管理。 为了提升用户体验和提高信息传递效率,系统集成了短信接口。在用户注册、密码找回、活动报名等关键操作环节,通过短信验证码进行验证。这需要与第三方短信服务提供商(如阿里云、腾讯云等)进行对接,利用其 SDK 实现短信的发送与接收功能。 会员管理:涵盖会员注册、登录、信息修改及权限分配等功能,方便社团成员进行自我管理。 活动管理:支持活动的创建、审批、报名以及评价等全流程管理,便于社团组织各类活动。 场地管理:实现场地的预定、审批和使用记录管理,确保资源的有效分配。 会议管理:提供会议安排、通知以及签到等功能,提升会议组织效率。 社团管理:包括社团的创建、修改、解散以及社团成员管理等功能。 消息通知:能够实时推送系统消息,保障信息的及时传达。 文件下发:支持文件的上传与下载,方便
<think>好的,用户现在想了解子网划分,之前已经问了IP地址是否是网络地址,现在继续深入子网相关的内容。我需要先回顾之前的对话,确保回答连贯。上次我解释了IP地址的结构和作用,提到了子网掩码的例子,比如192.168.1.100的子网掩码255.255.255.0,这可能为用户现在的问题做了铺垫。 用户可能是网络初学者,或者正在学习网络基础知识,需要理解如何将一个大的网络划分为更小的子网。我需要从基础概念讲起,说明子网划分的目的和好处,比如提高效率、减少广播域、优化管理等。 接下来要解释子网划分的具体步骤,可能包括确定需、选择子网掩码、计算网络地址和主机范围等。这里需要用简单的例子帮助用户理解,比如使用C类地址作为例子,因为C类地址比较常见,子网划分相对容易理解。 需要注意技术细节的准确性,比如子网掩码的作用,如何通过二进制计算确定网络位和主机位,以及如何计算每个子网的主机数量。同时要提醒用户关于子网划分中的保留地址(网络地址和广播地址),避免常见错误。 还要考虑用户可能的后续问题,比如为什么要划分子网,或者子网划分的实际应用场景,可以在回答中提前涵盖这些点,比如提到企业网络管理和安全策略的应用。 另外,用户之前的回答中提到了IPv4和IPv6,可能需要在子网划分中简要提及IPv6的不同之处,但主要焦点还是在IPv4,因为子网划分在IPv4中更为常见和必要。 最后,总结子网划分的重要性,并确保用结构清晰的中文表达,避免使用复杂术语,必要时使用示例和步骤分解,帮助用户逐步理解。</think>--- ### 一、子网划分的定义 **子网划分**(Subnetting)是将一个较大的IP网络(如一个A类、B类或C类网络)分割成多个较小的逻辑子网络(Subnet)的过程。通过子网掩码(Subnet Mask)调整网络地址和主机地址的边界,实现更灵活的地址管理和资源分配。 --- ### 二、为什么要划分子网? 1. **减少网络拥堵** 缩小广播域(Broadcast Domain),避免广播风暴。 2. **提升安全性** 隔离不同子网,限制内部通信范围。 3. **优化地址利用率** 避免IP地址浪费(例如将大网络拆分为适合实际需的子网)。 4. **简化管理** 不同部门或区域使用独立子网,便于故障排查和策略部署。 --- ### 三、子网划分的核心概念 1. **子网掩码(Subnet Mask)** 用于标识IP地址中**网络部分****主机部分**的边界。 *示例*: - IP地址:`192.168.1.100` - 子网掩码:`255.255.255.0`(二进制:`11111111.11111111.11111111.00000000`) - 网络地址:`192.168.1.0` - 可用主机范围:`192.168.1.1` ~ `192.168.1.254` 2. **CIDR表示法** 用“斜杠+数字”表示子网掩码中网络位的长度。 *示例*:`192.168.1.0/24` 表示前24位为网络地址。 --- ### 四、子网划分步骤(以IPv4为例) #### **案例**:将 `192.168.1.0/24` 划分为4个子网。 1. **确定需** - 需要4个子网 → 需借用2位主机位($2^2=4$)。 - 新子网掩码长度:`24 + 2 = 26`(即`255.255.255.192`)。 2. **计算子网地址** - 子网1:`192.168.1.0/26`(主机范围:`192.168.1.1` ~ `192.168.1.62`) - 子网2:`192.168.1.64/26`(主机范围:`192.168.1.65` ~ `192.168.1.126`) - 子网3:`192.168.1.128/26`(主机范围:`192.168.1.129` ~ `192.168.1.190`) - 子网4:`192.168.1.192/26`(主机范围:`192.168.1.193` ~ `192.168.1.254`) 3. **关键公式** - 每个子网的主机数:$2^{(32 - \text{子网掩码长度})} - 2$(减2是排除网络地址和广播地址)。 --- ### 五、子网划分的注意事项 1. **保留地址** - 每个子网的第一个地址为**网络地址**,最后一个地址为**广播地址**,不可分配给主机。 2. **规划扩展性** 预留部分子网或主机地址供未来扩展。 3. **IPv6的差异** IPv6通过更长的地址空间(128位)和固定前缀长度(如`/64`)简化子网划分。 --- ### 六、实际应用场景 - **企业网络**:将总部与分支机构的网络隔离。 - **云计算**:为不同租户分配独立子网。 - **物联网**:为不同设备类型划分专用子网。 --- ### 总结 子网划分是网络设计的核心技能,通过调整子网掩码实现地址的高效利用和网络结构的优化。掌握二进制转换、子网掩码计算和地址规划方法,是构建稳定、可扩展网络的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值