2024华为OD试题及答案-A076-荒地

题目描述

祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;
整体上常年光照良好,但是也有一些地区光照不太好。
某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,
其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。
我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。

输入描述

第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量
之后每行为调研区域每平方公里的发电量

输出描述

输出为这样的区域有多少个

用例
输入2 5 2 6
1 3 4 5 8
2 3 6 7 1
输出4
说明

输入含义:

调研的区域大小为长2宽5的矩形,我们要建设的电站的边长为2,建设电站最低发电量为6.

输出含义:

长宽为2的正方形满足发电量大于等于6的区域有4个。

输入2 5 1 6
1 3 4 5 8
2 3 6 7 1
输出3
说明

解析

题目要求我们在给定的矩阵区域内找到符合条件的区域,该区域必须是一个边长为 k 的正方形,并且该正方形内的所有值都必须大于等于某个给定的最小发电量 min_power。要求输出满足条件的正方形区域的个数。

解决思路:

  1. 问题分析
    • 给定一个 n x n 的矩阵,每个元素表示某个区域的发电量。
    • 需要检查矩阵中的每一个可能的 k x k 的子矩阵,判断该子矩阵内所有元素是否都大于等于 min_power
    • 如果是,则计数器加一。
  2. 算法策略
    • 遍历矩阵中所有可能的左上角坐标 (i, j),检查以 (i, j) 为左上角的 k x k 子矩阵是否满足条件。
    • 对于每一个 k x k 的子矩阵,遍历其所有元素,判断是否都满足条件。
    • 最后输出满足条件的子矩阵的数量。

C语言代码实现

以下是根据上述思路的C语言代码实现:

 
#include <stdio.h>

int main() {
    int n, k, min_power;
    
    // 输入n, k, min_power
    scanf("%d %d %d", &n, &k, &min_power);
    
    int matrix[n][n];
    
    // 输入矩阵的值
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    
    int count = 0;
    
    // 遍历所有可能的k x k子矩阵
    for (int i = 0; i <= n - k; i++) {
        for (int j = 0; j <= n - k; j++) {
            int valid = 1;
            for (int x = 0; x < k; x++) {
                for (int y = 0; y < k; y++) {
                    if (matrix[i + x][j + y] < min_power) {
                        valid = 0;
                        break;
                    }
                }
                if (!valid) break;
            }
            if (valid) count++;
        }
    }
    
    // 输出结果
    printf("%d\n", count);
    
    return 0;
}

代码说明

  1. 输入部分: 接收矩阵的大小 n,正方形的边长 k,以及最小发电量 min_power,并输入矩阵的值。
  2. 遍历矩阵: 对于每一个可能的左上角 (i, j),检查以其为起点的 k x k 子矩阵是否满足条件。
  3. 计数: 如果满足条件,则将计数器 count 加一。
  4. 输出部分: 输出满足条件的子矩阵数量。

Python 代码实现

将上述C语言代码转换成Python代码如下:

 
def count_valid_squares(matrix, n, k, min_power):
    count = 0
    
    # 遍历所有可能的k x k子矩阵
    for i in range(n - k + 1):
        for j in range(n - k + 1):
            valid = True
            for x in range(k):
                for y in range(k):
                    if matrix[i + x][j + y] < min_power:
                        valid = False
                        break
                if not valid:
                    break
            if valid:
                count += 1
    
    return count

# 输入部分
n, k, min_power = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]

# 计算满足条件的区域数量
result = count_valid_squares(matrix, n, k, min_power)

# 输出结果
print(result)

代码说明

  • 函数 count_valid_squares: 用于计算矩阵中符合条件的 k x k 子矩阵的数量。
  • 遍历矩阵: 对每一个可能的左上角坐标 (i, j),检查 k x k 子矩阵的所有元素是否满足条件。
  • 输入和输出: 接收矩阵的大小、正方形的边长、最小发电量和矩阵的值,并输出满足条件的正方形区域的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值