华为OD机试 - 分配土地( Python C C++ JavaGo JS PHP)

题目描述

从前有个村庄,村民们在各种田地上插上小旗子,每个旗子上都标识了一个数字。现在,村民们想要找出一个包含相同数字的最小矩形区域,并将这块土地分配给对村庄做出巨大贡献的村民。我们需要找出这个矩形区域的最大面积。

输入描述

  • 第一行输入两个整数 m 和 n,分别代表土地的长和宽。
  • 接下来 m 行,每行 n 个整数,代表地图上的具体标识。其中,旗子上的数字为 1-500,未插旗子的土地用 0 标识。

输出描述

输出一个整数,代表此次分配土地时,做出贡献的村民能分配到的最大面积。

示例

在这里插入图片描述

题目解析

这个问题可以通过遍历所有可能的矩形区域来解决。对于每个数字,我们需要找到包含该数字的所有矩形区域,并计算它们的面积。然后,从这些矩形中选择面积最小的一个,作为该数字对应的最小矩形区域。最后,从所有数字对应的最小矩形区域中选择面积最大的一个,作为最终的答案。

然而,这种方法的时间复杂度非常高,因为需要遍历所有可能的矩形区域。在实际应用中,我们可以使用一种更高效的方法来解决这个问题。

观察题目,我们可以发现,对于每个数字,我们只需要找到包含该数字的所有连通区域,并计算它们的面积。然后,从这些连通区域中选择面积最小的一个,作为该数字对应的最小矩形区域。这样,我们就可以将问题转化为寻找连通区域的问题。

为了找到包含某个数字的所有连通区域,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法。从每个包含该数字的点开始搜索,直到找到所有与该点连通的点。然后,计算这些点的最小矩形区域,并更新该数字对应的最小矩形区域。

最后,从所有数字对应的最小矩形区域中选择面积最大的一个作为最终的答案。

  1. 创建一个二维数组来存储地图上的标识。
  2. 对于每个数字(1-500),使用 DFS 或 BFS 找到包含该数字的所有连通区域,并计算它们的面积。可以使用一个辅助数组来标记已经访问过的点。
  3. 对于每个连通区域,计算其最小矩形区域的面积。可以通过找到连通区域中所有点的最小和最大坐标来实现。
  4. 更新该数字对应的最小矩形区域的面积。可以使用一个哈希表来存储每个数字对应的最小矩形区域的面积。
  5. 从哈希表中选择面积最大的值作为最终的答案。
  6. 输出答案。

Python代码实现

def dfs(grid, row, col, num, visited):
    # 检查边界条件和访问状态
    if row < 0 or row >= len(grid) or col < 0 or col >= len(grid[0]) or visited[row][col] or grid[row][col] != num:
        return 0
    
    # 标记当前位置为已访问
    visited[row][col] = True
    
    # 向四个方向递归搜索,并计算连通区域的面积
    area = 1
    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    for dx, dy in directions:
        area += dfs(grid, row + dx, col + dy, num, visited)
    
    return area

def find_min_rectangle_area(grid):
    if not grid or not grid[0]:
        return 0
    
    m, n = len(grid), len(grid[0])
    visited = [[False] * n for _ in range(m)]
    min_area = float('inf')  # 初始化为无穷大
    
    # 遍历所有数字和对应的位置
    for i in range(m):
        for j in range(n):
            if not visited[i][j] and grid[i][j] != 0:
                num = grid[i][j]
                area = dfs(grid, i, j, num, visited)
                # 找到最小矩形面积
                min_area = min(min_area, area)
    
    # 如果没有找到有效的矩形区域,返回0
    return min_area if min_area != float('inf') else 0

# 示例输入
m, n = 4, 4
grid = [
    [1, 1, 1, 1],
    [1, 0, 0, 1],
    [1, 0, 1, 1],
    [1, 1, 1, 1]
]

# 计算并输出最小矩形面积
print(find_min_rectangle_area(grid))  # 输出应为4,因为最小矩形区域是2x2的

C++代码实现

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
using namespace std;  
  
// 方向数组,用于DFS中的四个方向移动  
const int dx[] = {-1, 1, 0, 0};  
const int dy[] = {0, 0, -1, 1};  
  
// DFS函数,计算以(row, col)为起点的连通区域面积  
int dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int row, int col, int num) {  
    if (row < 0 || row >= grid.size() || col < 0 || col >= grid[0].size() ||  
        visited[row][col] || grid[row][col] != num) {  
        return 0;  
    }  
  
    visited[row][col] = true;  
    int area = 1;  
    for (int i = 0; i < 4; ++i) {  
        area += dfs(grid, visited, row + dx[i], col + dy[i], num);  
    }  
    return area;  
}  
  
// 主函数,寻找最小矩形区域的面积  
int findMinRectangleArea(vector<vector<int>>& grid) {  
    if (grid.empty() || grid[0].empty()) return 0;  
  
    int m = grid.size();  
    int n = grid[0].size();  
    int minArea = INT_MAX;  
  
    // 对每个非零数字进行遍历  
    for (int i = 0; i < m; ++i) {  
        for (int j = 0; j < n; ++j) {  
            if (grid[i][j] != 0) {  
                vector<vector<bool>> visited(m, vector<bool>(n, false));  
                int num = grid[i][j];  
                int area = dfs(grid, visited, i, j, num);  
                minArea = min(minArea, area);  
            }  
        }  
    }  
  
    // 如果没有找到有效的矩形区域,返回0  
    return (minArea == INT_MAX) ? 0 : minArea;  
}  
  
int main() {  
    int m, n;  
    cin >> m >> n;  
  
    vector<vector<int>> grid(m, vector<int>(n));  
    for (int i = 0; i < m; ++i) {  
        for (int j = 0; j < n; ++j) {  
            cin >> grid[i][j];  
        }  
    }  
  
    int result = findMinRectangleArea(grid);  
    cout << "The minimum rectangle area is: " << result << endl;  
  
    return 0;  
}

C代码实现

#include <stdio.h>
#include <stdlib.h>

using namespace std;

const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};

int dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int row, int col, int num) {
    if (row < 0 || row >= grid.size() || col < 0 || col >= grid[0].size() ||
        visited[row][col] || grid[row][col] != num) {
        return 0;
    }

    visited[row][col] = true;
    int area = 1;
    for (int i = 0; i < 4; ++i) {
        area += dfs(grid, visited, row + dx[i], col + dy[i], num);
    }
    return area;
}

int findMinRectangleArea(vector<vector<int>>& grid) {
    if (grid.empty() || grid[0].empty()) return 0;

    int m = grid.size();
    int n = grid[0].size();
    int minArea = INT_MAX;

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            if (grid[i][j] != 0) {
                vector<vector<bool>> visited(m, vector<bool>(n, false));
                int num = grid[i][j];
                int area = dfs(grid, visited, i, j, num);
                minArea = min(minArea, area);
            }
        }
    }

    return (minArea == INT_MAX) ? 0 : minArea;
}

int main() {
    int m, n;
    scanf("%d %d", &m, &n);

    vector<vector<int>> grid(m, vector<int>(n));
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &grid[i][j]);
        }
    }

    int result = findMinRectangleArea(grid);
    printf("The minimum rectangle area is: %d\n", result);

    return 0;
}

Java代码实现

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the number of rows and columns:");
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int[][] grid = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }
        int result = findMinRectangleArea(grid);
        System.out.println("The minimum rectangle area is: " + result);
    }

    public static int findMinRectangleArea(int[][] grid) {
        if (grid.length == 0 || grid[0].length == 0) {
            return 0;
        }

        int m = grid.length;
        int n = grid[0].length;
        int minArea = Integer.MAX_VALUE;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] != 0) {
                    boolean[][] visited = new boolean[m][n];
                    int num = grid[i][j];
                    int area = dfs(grid, visited, i, j, num);
                    minArea = Math.min(minArea, area);
                }
            }
        }

        return minArea == Integer.MAX_VALUE ? 0 : minArea;
    }

    public static int dfs(int[][] grid, boolean[][] visited, int row, int col, int num) {
        if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length ||
            visited[row][col] || grid[row][col] != num) {
            return 0;
        }

        visited[row][col] = true;
        int area = 1;
        for (int i = 0; i < 4; i++) {
            area += dfs(grid, visited, row + dx[i], col + dy[i], num);
        }
        return area;
    }

    private static int[] dx = {-1, 1, 0, 0};
    private static int[] dy = {0, 0, -1, 1};
}

Go代码实现

package main

import (
	"container/heap"
	"fmt"
	"math/rand"
	"strconv"
	"time"
)

const (
	dx = [4]int{-1, 1, 0, 0}
	dy = [4]int{0, 0, -1, 1}
)

func dfs(grid [][]int, visited [][]bool, row, col, num int) int {
	if row < 0 || row >= len(grid) || col < 0 || col >= len(grid[0]) ||
		visited[row][col] || grid[row][col] != num {
		return 0
	}

	visited[row][col] = true
	area := 1
	for i := 0; i < 4; i++ {
		area += dfs(grid, visited, row+dx[i], col+dy[i], num)
	}
	return area
}

func findMinRectangleArea(grid [][]int) int {
	m, n := len(grid), len(grid[0])
	minArea := 0
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if grid[i][j] != 0 {
				visited := make([][]bool, m)
				for k := range visited {
					visited[k] = make([]bool, n)
				}
				num := grid[i][j]
				area := dfs(grid, visited, i, j, num)
				if minArea == 0 || area < minArea {
					minArea = area
				}
			}
		}
	}

	if minArea == 0 {
		return 0
	}
	return minArea
}

func main() {
	var m, n int
	fmt.Scan(&m, &n)

	grid := make([][]int, m)
	for i := range grid {
		grid[i] = make([]int, n)
	}

	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			fmt.Scan(&grid[i][j])
		}
	}

	result := findMinRectangleArea(grid)
	fmt.Println("The minimum rectangle area is:", result)
}

PHP代码实现

<?php

function findMinRectangleArea($grid) {
    $m = count($grid);
    $n = count($grid[0]);
    $minArea = INT_MAX;

    for ($i = 0; $i < $m; $i++) {
        for ($j = 0; $j < $n; $j++) {
            if ($grid[$i][$j] != 0) {
                $visited = array_fill(0, $m, array_fill(0, $n, false));
                $num = $grid[$i][$j];
                $area = $this->dfs($grid, $visited, $i, $j, $num);
                $minArea = min($minArea, $area);
            }
        }
    }

    return $minArea == INT_MAX ? 0 : $minArea;
}

private function dfs($grid, $visited, $row, $col, $num) {
    if ($row < 0 || $row >= count($grid) || $col < 0 || $col >= count($grid[0]) ||
        $visited[$row][$col] || $grid[$row][$col] != $num) {
        return 0;
    }

    $visited[$row][$col] = true;
    $area = 1;
    for ($i = 0; $i < 4; $i++) {
        $area += $this->dfs($grid, $visited, $row + $this->dx[$i], $col + $this->dy[$i], $num);
    }
    return $area;
}

private $dx = array(-1, 1, 0, 0);
private $dy = array(0, 0, -1, 1);

$grid = array(
    // 示例数据
    array(1, 1, 1, 0, 0),
    array(1, 1, 1, 0, 0),
    array(1, 1, 1, 0, 0),
    array(0, 0, 0, 0, 0),
    array(0, 0, 0, 0, 0)
);

echo "Enter the number of rows and columns:" . PHP_EOL;
$m = intval(fgets(STDIN));
$n = intval(fgets(STDIN));
$grid = array_fill(0, $m, array_fill(0, $n, 0));
for ($i = 0; $i < $m; $i++) {
    for ($j = 0; $j < $n; $j++) {
        $grid[$i][$j] = intval(fgets(STDIN));
    }
}

$result = findMinRectangleArea($grid);
echo "The minimum rectangle area is: " . $result . PHP_EOL;

JS代码实现

const { Your_function } = require(‘Your_script’);

function main() {
    const scanner = require('scanner');
    console.log('Enter the number of rows and columns:');
    const m = scanner.nextInt();
    const n = scanner.nextInt();
    const grid = new Array(m).fill(0).map(() => new Array(n).fill(0));
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            grid[i][j] = scanner.nextInt();
        }
    }
    const result = findMinRectangleArea(grid);
    console.log('The minimum rectangle area is: ' + result);
}

function findMinRectangleArea(grid) {
    if (grid.length === 0 || grid[0].length === 0) {
        return 0;
    }

    const m = grid.length;
    const n = grid[0].length;
    let minArea = Infinity;

    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (grid[i][j] !== 0) {
                const visited = new Array(m).fill(0).map(() => new Array(n).fill(false));
                const num = grid[i][j];
                const area = dfs(grid, visited, i, j, num);
                minArea = Math.min(minArea, area);
            }
        }
    }

    return minArea === Infinity ? 0 : minArea;
}

function dfs(grid, visited, row, col, num) {
    if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length ||
        visited[row][col] || grid[row][col] !== num) {
        return 0;
    }

    visited[row][col] = true;
    let area = 1;
    for (let i = 0; i < 4; i++) {
        area += dfs(grid, visited, row + dx[i], col + dy[i], num);
    }
    return area;
}

const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/387521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络原理(3)--以太网协议,DNS

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(3)–以太网协议,DNS 在网络原理(2)中介绍了网络层中的一个重要的协议–ip协议,网络层关注的通信时的起点和终点,而数据链路层更加"底层"一些,关注的是传输过程…

嵌入式软件设计入门:从零开始学习嵌入式软件设计

&#xff08;本文为简单介绍&#xff0c;个人观点仅供参考&#xff09; 首先,让我们了解一下嵌入式软件的定义。嵌入式软件是指运行在嵌入式系统中的特定用途软件,它通常被用来控制硬件设备、处理实时数据和实现特定功能。与桌面应用程序相比,嵌入式软件需要具备更高的实时性、…

第13讲创建图文投票

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b;、 <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&…

MATLAB知识点:randsample函数(★★★☆☆)生成随机样本的函数,可指定有放回和无放回随机抽样

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

机器学习:Pooling层作用及反向传播

CNN网络在反向传播中需要逐层向前求梯度&#xff0c;然而pooling层没有可学习的参数&#xff0c;那它是如何进行反向传播的呢&#xff1f;此外&#xff0c;CNN中为什么要加pooling层&#xff0c;它的作用是什么&#xff1f; Pooling层 CNN一般采用average pooling或max pooli…

【STM32 CubeMX】GPIO_HAL库源码分析

文章目录 前言一、GPIO_HAL库源码分析1.1 初始化GPIO1.2 HAL_GPIO_Init源码分析GPIO_InitTypeDef初始化结构体HAL_GPIO_Init函数 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技…

判断一个时间序列中的元素是否属于一个月的第一天或最后一天

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断一个时间序列中的元素 是否属于一个月的第一天或最后一天 Series.dt.is_month_start Series.dt.is_month_end [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd ts pd.S…

【JavaEE】传输层网络协议

传输层网络协议 1. UDP协议 1.1 特点 面向数据报&#xff08;DatagramSocket&#xff09;数据报大小限制为64k全双工不可靠传输有接收缓冲区&#xff0c;无发送缓冲区 UDP的特点&#xff0c;我理解起来就是工人组成的**“人工传送带”**&#xff1a; 面向数据报&#xff08;…

Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析

案例 接下来我们就通过一个案例来演示下事务传播行为propagation属性的使用。 需求&#xff1a;解散部门时需要记录操作日志 由于解散部门是一个非常重要而且非常危险的操作&#xff0c;所以在业务当中要求每一次执行解散部门的操作都需要留下痕迹&#xff0c;就是要记录操作…

FL Studio2024最新中文版有哪些其新功能特点?

除了之前提到的特点外&#xff0c;FL Studio 21还有以下一些值得注意的特点&#xff1a; 高效的音频处理&#xff1a;FL Studio 21具备高效的音频处理能力&#xff0c;能够实时处理多轨道音频&#xff0c;提供低延迟的音频播放和录制&#xff0c;确保音乐制作过程中的流畅性和实…

【数据库_MySQL】MySQL彻底卸载

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 卸载 要是你的…

4核16G服务器价格腾讯云PK阿里云

4核16G服务器租用优惠价格26元1个月&#xff0c;腾讯云轻量4核16G12M服务器32元1个月、96元3个月、156元6个月、312元一年&#xff0c;阿腾云atengyun.com分享4核16服务器租用费用价格表&#xff0c;阿里云和腾讯云详细配置报价和性能参数表&#xff1a; 腾讯云4核16G服务器价…

修改npm 的运行命令详解

在Node.js和npm中&#xff0c;你可以通过修改package.json文件中的scripts部分来定义和运行自定义的npm脚本。这些脚本可以是任何你希望在项目中运行的命令&#xff0c;包括启动服务器、运行测试、构建项目等。下面是一些修改npm运行命令的详解和代码示例。 修改npm运行命令的…

RAG (Retrieval Augmented Generation)简介

1. 背景 目前大模型很多&#xff0c;绝大部分大模型都是通用型大模型&#xff0c;也就是说使用的是标准的数据&#xff0c;比如wikipedia&#xff0c;百度百科&#xff0c;。。。。 中小型企业一般都有自己的知识库&#xff0c;而这些知识库的数据没有在通用型的大模型中被用到…

算法学习——LeetCode力扣贪心篇1

算法学习——LeetCode力扣贪心篇1 455. 分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[…

Spring Security实现权限认证与授权

一、Spring Security Spring Security作为Spring家族的安全框架&#xff0c;在安全方面的两个核心功能是认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;。 &#xff08;1&#xff09;用户认证指的是&#xff1a;验证某个用户是否为系…

证明之缺角正方形网格的铺地砖问题

缺角正方形网格的铺地砖问题 “挑战难题&#xff1a;多米诺骨牌与无法覆盖的方格” 这里有个著名的难题。画八横八纵正方形网格&#xff0c;去掉相对的两个角。你能用多米诺骨牌形状的地砖——每一块正好覆盖两个相邻方格&#xff0c;把剩余部分覆盖吗&#xff1f;我在下图中…

哈希表 ?

哈希表 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 哈希表是根据关键码的值而直接进行访问的数据结构。 这么这官方的解释…

php基础学习之运算符(重点在连接符和错误抑制符)

运算符总结 在各种编程语言中&#xff0c;常用的运算符号有这三大类&#xff1a; 算术运算符&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%位运算符&#xff1a;&&#xff0c;|&#xff0c;^&#xff0c;<<&#xff0c;>>赋值运算符&…

【深度学习每日小知识】交并集 (IoU)

交并集 (IOU) 是一种性能指标&#xff0c;用于评估注释、分割和对象检测算法的准确性。它量化数据集中的预测边界框或分段区域与地面实况边界框或注释区域之间的重叠。 IOU 提供了预测对象与实际对象注释的对齐程度的衡量标准&#xff0c;从而可以评估模型准确性并微调算法以改…