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

news2024/11/25 18:28:43

题目描述

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

输入描述

  • 第一行输入两个整数 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];

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPI NOR FLASH和SPI NAND FLASH

SPI NOR FLASH和SPI NAND FLASH是两种不同的存储设备&#xff0c;它们在硬件接口和软件应用上都有所不同。以下是关于这两种存储设备更详细的介绍&#xff1a; 1.SPI NOR FLASH SPI NOR FLASH是一种非易失性存储器&#xff0c;它通过串行接口进行数据传输&#xff0c;具有读写…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

一文读懂:Docker从入门到进阶(超详细实践应用、零踩坑)

文章目录 快速入门简介安装配置镜像加速部署MySQL Docker基础常见命令案例-部署Nginx命令别名数据卷挂载本地目录挂载DockerFile语法自定义镜像容器网络互联 项目部署部署Java应用部署前端DockerCompose 快速入门 简介 Docker是一个快速构建、运行、管理应用的工具。 传统的…

【Linux】学习-基础IO拓展篇

Linux基础IO拓展篇—详解文件系统 理解文件系统 在Linux基础IO篇中&#xff0c;我们站在用户的视角对文件进行了理解&#xff0c;主要是针对被打开的文件&#xff0c;那么有没有没有被打开的文件呢&#xff1f;当然有&#xff01;今天我们换个视角&#xff0c;来站在系统的角…

考研数据结构笔记(7)

循环链表、静态链表、顺序表和链表的比较 循环链表循环单链表循环双链表 静态链表什么是静态链表如何定义一个静态链表&#xff1f;简述基本操作的实现 顺序表和链表的比较逻辑结构物理结构/存储结构数据的运算/基本运算创建销毁增加、删除查找 循环链表 循环单链表 循环双链表…

【Linux】学习-进程间通信

进程间通信 介绍 进程间通信的本质 进程间通信的前提&#xff0c;首先需要让不同的进程看到同一块“内存”此“内存”一定不属于任何进程&#xff0c;而应该强调共享二字 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;…

springcloud分布式架构网上商城源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

微信小程序的大学生心理测试+后台管理

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

Acwing---839. 模拟堆

模拟堆 1.题目2.基本思想3.代码实现 1.题目 维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08…

Python网络通信

目录 基本的网络知识 TCP/IP IP地址 端口 HTTP/HTTPS HTTP HTTPS 搭建自己的Web服务器 urllib.request模块 发送GET请求 发送POST请求 JSON数据 JSON文档的结构 JSON数据的解码 下载图片示例 返回所有备忘录信息 此文章讲解如何通过Python访问互联网上的资源&a…

工业互联网IoT物联网设备网络接入认证安全最佳实践

制造业数字化转型过程中&#xff0c;产线物联网&#xff08;IoT&#xff09;设备、工控机的引入极大提高了生产效率的同时&#xff0c;也埋下了不容忽视的安全隐患。尤其制造业已成为勒索软件攻击的重灾区&#xff0c;利用物联网设备漏洞进行恶意攻击的事件不胜枚举&#xff0c…

【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

天猫数据分析(天猫数据查询分析工具/软件):2023年天猫户外用品市场蓬勃发展,国产品牌具备竞争优势

后疫情时代&#xff0c;大众对于户外活动的热情高涨&#xff0c;参与度迅速提升&#xff0c;在这一消费热情下&#xff0c;我国的户外用品行业呈现出蓬勃的发展态势&#xff0c;市场规模不断扩大。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;2023年度&#xff0c;…

HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定

本文 我们还是来说 两个 harmonyos 状态管理的装饰器 Observed与ObjectLink 他们是用于 嵌套对象 或者 以对象类型为数组元素 的数据结构 做双向同步的 之前 我们说过的 state和link 都无法捕捉到 这两种数据内部结构的变化 这里 我们模拟一个类数据结构 class Person{name:…

Python 3 中使用 pandas 和 Jupyter Notebook 进行数据分析和可视化

简介 Python 的 pandas 包用于数据操作和分析&#xff0c;旨在让您以直观的方式处理带标签或关联数据。 pandas 包提供了电子表格功能&#xff0c;但由于您正在使用 Python&#xff0c;因此它比传统的图形电子表格程序要快得多且更高效。 在本教程中&#xff0c;我们将介绍如…

Python运算符大全,值得收藏

一、 Python的算术运算 Python的算术运算符与C语言类似&#xff0c;略有不同。包括加()、减(-)、乘(*)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位(>>)、单目求反(-)、幂运算(**)、整除运算(//)、增强运算、增强矩阵乘法()。 …

【开源】SpringBoot框架开发个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

数据结构第十五天(树的存储/孩子表示法)

目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 最近在知乎上看到的一个问题&#xff0c; 也许&#xff0c;短暂的离别&#xff0c;只为更好的相遇&#xff01; 2024&#xff0c;友友们&#xff0c;龙年快乐&#xff0c;新的一年&#xff0c;祝愿码上…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…