【华为OD】C卷真题 100%通过:分配土地 JS源码实现【思路+源码】

 C++代码实现:

【华为OD】C卷真题 100%通过:分配土地 C++源码实现-CSDN博客

 C语言代码实现:

【华为OD】C卷真题 100%通过:分配土地 C语言源码实现-CSDN博客

Python代码实现:

【华为OD】C卷真题 100%通过:分配土地 Python源码实现-CSDN博客

Java代码实现:

【华为OD】C卷真题 100%通过:分配土地 Java源码实现【思路+源码】-CSDN博客 

题目描述:

从前有个村庄,村民们喜欢在各种田地上插上小旗子,旗子上标识了各种不同的数字。某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民,请问,此次分配土地,做出贡献的村民中最大会分配多大面积?

输入描述

第一行输入m和n,m代表村子的土地的长,n代表土地的宽

第二行开始输入地图上的具体标识

输出描述

输出需要分配的土地面积,即包含相同数字旗子的最小矩阵中的最大面积。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3 3
1 0 1
0 0 0
0 1 0

输出

9

说明

土地上的旗子为1,其坐标分别为(0,0),(2,1)以及(0,2),为了覆盖所有旗子,矩阵需要覆盖的横坐标为0和2,纵坐标为0和2,所以面积为9,即(2-0+1)*(2-0+1)=9。

示例2

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

3 3
1 0 2
0 0 0
0 3 4

输出

1

说明

由于不存在成对的小旗子,故而返回1,即一块土地的面积。

备注

旗子上的数字为1-500,土地边长不超过500

未插旗子的土地用0标识

     5                                                         
                                                            
              +---+                                                          
  3            |   |       |+                                |       +---|   
  +           |   | 3      |                6                |  |   +   |        +
  +      +     |   |       |         +                       |    |  +   |       +
  +      +    |   +---+    |        +        +++++           |   |  +   |        +
  +      +    | +      |   |   +----+        |   |           |   |  +   |        +
  +      +  3 | +      |   |   +    +      2 |   |     2     |   |  +   |        +
  +      +    | +      |   |   +    +        |   |           |   |  +   |        +
  +      +---+ |     |    |  +    +    ----+   |   +---+    |  |  +   |         +
  +      |     |     |    |  +    +    |       |   |   |    |  |  +   |         +
  +    1 |     |     | 8  |  +    +  1 |   |    | 1 |   | 1 |   |  +   |        +
  +      |     |     |    |  +    +    |   |    |   |   |   |   |  +   |        +
  +  +---+     |     +---+   +    ++---+    |   +---+   +---+   |  +   |        +
  +  |         |         |   +    |         |              |   |  |+   |        +
  +0 |         |         | 0 +  0 |         |              | 0 |  |+   |        +
  +  |         |         |   +    |         |              |   |  |+   |        +
  +---+         +          +-------+                       +---+| +|+   |        +
                +                                                    +   |        +
    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14   15  +   |+----16 17 18
 

题目解析:

        需求确定好相同旗帜的宽高即可得到矩形面积了

JS代码实现:

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readLine = async () => (await iter.next()).value;

async function main() {
  const mn = (await readLine()).trim().split(" ");
  const m = parseInt(mn[0]);
  const n = parseInt(mn[1]);
  const map = new Array(m).fill(0).map(() => new Array(n).fill(0));
  const aSet = new Set();

  for (let i = 0; i < m; i++) {
    const values = (await readLine()).trim().split(" ");
    for (let j = 0; j < n; j++) {
      map[i][j] = parseInt(values[j]);
      if (map[i][j] !== 0) {
        aSet.add(map[i][j]);
      }
    }
  }

  let maxArea = 0;
  for (const num of aSet) {
    let beginI = m;
    let beginJ = n;
    let endI = -1;
    let endJ = -1;
    for (let i = 0; i < m; i++) {
      for (let j = 0; j < n; j++) {
        if (map[i][j] === num) {
          beginI = Math.min(beginI, i);
          beginJ = Math.min(beginJ, j);
          endI = Math.max(endI, i);
          endJ = Math.max(endJ, j);
        }
      }
    }
    if (endI >= beginI && endJ >= beginJ) {
      const a = (endI - beginI + 1) * (endJ - beginJ + 1);
      maxArea = Math.max(maxArea, a);
    }
  }
  console.log(maxArea);
  rl.close();
}

main();

【华为OD】C卷真题 100%通过:分配土地 JS源码实现【思路+源码】_第1张图片

你可能感兴趣的:(杂谈,java,算法,开发语言,华为od,c语言,c++,javascript)