【俄罗斯方块】

【俄罗斯方块】

      • C语言实现
      • C++实现
      • Java实现
      • Python实现


💐The Begin💐点点关注,收藏不迷路💐

首先把经典的俄罗斯方块简化一下:方块有顺序地从屏幕顶端掉下至底部,当碰到障碍物或底部时停下,同时变成新的障碍物。游戏规则规定,只能在方块下落停止前决定下落时的横向位置,使这个方块编程障碍物后的高度最低,且如果有集中横向位置是这个方块编程障碍物后高度最低时,取最左边的横向位置下落。

输入

第1行有2个整数,表示方块数n和屏幕宽度w,之间用1个空格分隔。
第2行至地i+1行,每行一个整数,为第i个方块的变长为a。

输出

输出一个整数,表示最后障碍物的最高点高度。

样例输入

3 5
2
1
3

样例输出

4

C语言实现

#include <stdio.h>
#include <string.h>

// 定义一个较大的数,用于表示无穷大的概念
#define INF 100000

// 计算俄罗斯方块游戏结束后障碍物的最高点高度
int russianBlocks(int n, int w, int blocks[]) {
    int h[2010];  // 用于存储每一列的高度,假设屏幕宽度最大为2010,可根据实际情况调整
    int maxx = 0;

    // 初始化每一列的高度为0
    for (int i = 0; i < w; i++) {
        h[i] = 0;
    }

    // 遍历每个方块
    for (int i = 0; i < n; i++) {
        int a = blocks[i];
        int minn = INF;  // 初始化最小高度为一个较大的值
        int mi = 0;  // 用于记录使得放置方块后高度最低的起始列索引

        // 遍历每一个可能放置方块的起始位置
        for (int j = 0; j < w - a + 1; j++) {
            int max = 0;

            // 检查在当前起始位置放置方块所覆盖列中的最大高度
            for (int k = j; k <= j + a - 1; k++) {
                if (h[k] > max) {
                    max = h[k];
                }
            }

            // 如果当前位置放置方块后的最大高度比之前记录的最小高度还小,更新最小高度和对应的索引
            if (max < minn) {
                minn = max;
                mi = j;
            }
        }

        // 在找到的最佳位置放置方块,更新对应列的高度
        for (int j = mi; j <= mi + a - 1; j++) {
            h[j] = minn + a;
        }
    }

    // 找到所有列高度中的最大值,即障碍物的最高点高度
    for (int i = 0; i < w; i++) {
        if (h[i] > maxx) {
            maxx = h[i];
        }
    }

    return maxx;
}

int main() {
    int n, w;
    int blocks[1000];  // 假设方块数量最多为1000个,可根据实际情况调整

    // 读取方块数量和屏幕宽度
    scanf("%d %d", &n, &w);

    // 读取每个方块的边长
    for (int i = 0; i < n; i++) {
        scanf("%d", &blocks[i]);
    }

    // 调用函数计算并输出最后障碍物的最高点高度
    printf("%d\n", russianBlocks(n, w, blocks));

    return 0;
}

C++实现

#include <iostream>
#include <algorithm>
#include <cstring>

// 定义一个较大的数,用于表示无穷大的概念
const int INF = 100000;

// 计算俄罗斯方块游戏结束后障碍物的最高点高度
int russianBlocks(int n, int w, const int blocks[]) {
    int h[2010];  // 用于存储每一列的高度,假设屏幕宽度最大为2010,可根据实际情况调整
    int maxx = 0;

    // 初始化每一列的高度为0
    std::fill_n(h, w, 0);

    // 遍历每个方块
    for (int i = 0; i < n; i++) {
        int a = blocks[i];
        int minn = INF;  // 初始化最小高度为一个较大的值
        int mi = 0;  // 用于记录使得放置方块后高度最低的起始列索引

        // 遍历每一个可能放置方块的起始位置
        for (int j = 0; j < w - a + 1; j++) {
            int max = 0;

            // 检查在当前起始位置放置方块所覆盖列中的最大高度
            for (int k = j; k <= j + a - 1; k++) {
                if (h[k] > max) {
                    max = h[k];
                }
            }

            // 如果当前位置放置方块后的最大高度比之前记录的最小高度还小,更新最小高度和对应的索引
            if (max < minn) {
                minn = max;
                mi = j;
            }
        }

        // 在找到的最佳位置放置方块,更新对应列的高度
        for (int j = mi; j <= mi + a - 1; j++) {
            h[j] = minn + a;
        }
    }

    // 找到所有列高度中的最大值,即障碍物的最高点高度
    for (int i = 0; i < w; i++) {
        if (h[i] > maxx) {
            maxx = h[i];
        }
    }

    return maxx;
}

int main() {
    int n, w;
    int blocks[1000];  // 假设方块数量最多为1000个,可根据实际情况调整

    // 读取方块数量和屏幕宽度
    std::cin >> n >> w;

    // 读取每个方块的边长
    for (int i = 0; i < n; i++) {
        std::cin >> blocks[i];
    }

    // 调用函数计算并输出最后障碍物的最高点高度
    std::cout << russianBlocks(n, w, blocks) << std::endl;

    return 0;
}

Java实现

import java.util.Scanner;

// 计算俄罗斯方块游戏结束后障碍物的最高点高度
public class Main {

    // 定义一个较大的数,用于表示无穷大的概念
    public static final int INF = 100000;

    public static int russianBlocks(int n, int w, int[] blocks) {
        int[] h = new int[2010];  // 用于存储每一列的高度,假设屏幕宽度最大为2010,可根据实际情况调整
        int maxx = 0;

        // 初始化每一列的高度为0
        for (int i = 0; i < w; i++) {
            h[i] = 0;
        }

        // 遍历每个方块
        for (int i = 0; i < n; i++) {
            int a = blocks[i];
            int minn = INF;  // 初始化最小高度为一个较大的值
            int mi = 0;  // 用于记录使得放置方块后高度最低的起始列索引

            // 遍历每一个可能放置方块的起始位置
            for (int j = 0; j < w - a + 1; j++) {
                int max = 0;

                // 检查在当前起始位置放置方块所覆盖列中的最大高度
                for (int k = j; k <= j + a - 1; k++) {
                    if (h[k] > max) {
                    max = h[k];
                    }
                }

                // 如果当前位置放置方块后的最大高度比之前记录的最小高度还小,更新最小高度和对应的索引
                if (max < minn) {
                    minn = max;
                    mi = j;
                }
            }

            // 在找到的最佳位置放置方块,更新对应列的高度
            for (int j = mi; j <= mi + a - 1; j++) {
                h[j] = minn + a;
            }
        }

        // 找到所有列高度中的最大值,即障碍物的最高点高度
        for (int i = 0; i < w; i = i + 1) {
            if (h[i] > maxx) {
                maxx = h[i];
            }
        }

        return maxx;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int w = scanner.nextInt();

        int[] blocks = new int[n];

        // 读取每个方块的边长
        for (int i = 0; i < n; i++) {
            blocks[i] = scanner.nextInt();
        }

        // 调用函数计算并输出最后障碍物的最高点高度
        System.out.println(russianBlocks(n, w, blocks));

        scanner.close();
    }
}

Python实现

def russian_blocks(n, w, blocks):
    h = [0] * w  # 用于存储每一列的高度
    maxx = 0

    # 遍历每个方块
    for i in range(n):
        a = blocks[i]
        minn = 100000  # 初始化最小高度为一个较大的值
        mi = 0  # 用于记录使得放置方块后高度最低的起始列索引

        # 遍历每一个可能放置方块的起始位置
        for j in range(w - a + 1):
            max_value = 0

            # 检查在当前起始位置放置方块所覆盖列中的最大高度
            for k in range(j, j + a):
                if h[k] > max_value:
                    max_value = h[k]

            # 如果当前位置放置方块后的最大高度比之前记录的最小高度还小,更新最小高度和对应的索引
            if max_value < minn:
                minn = max_value
                mi = j

        # 在找到的最佳位置放置方块,更新对应列的高度
        for j in range(mi, mi + a):
            h[j] = minn + a

    # 找到所有列高度中的最大值,即障碍物的最高点高度
    for i in range(w):
        if h[i] > maxx:
            maxx = h[i]

    return maxx


n, w = map(int, input().split())
blocks = [int(input()) for i in range(n)]

# 调用函数计算并输出最后障碍物的最高点高度
print(russian_blocks(n, w, blocks))

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

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

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

相关文章

优化装配,提升品质:虚拟装配在汽车制造中的关键作用

汽车是各种零部件的有机结合体&#xff0c;因此汽车的装配工艺水平和装配质量直接影响着汽车的质量与性能。在汽车装配过程中&#xff0c;经常会发生零部件间干涉或装配顺序不合理等现象&#xff0c;且许多零部件制造阶段产生的质量隐患要等到实际装配阶段才能显现出来&#xf…

【算法】日期问题(C/C++)

目录 日期问题概述 一、闰年判断 问题描述&#xff1a; 解决方法&#xff1a; 代码实现&#xff1a; 二、回文日期 问题描述&#xff1a; 链接&#xff1a;2867. 回文日期 - AcWing题库 解决方法&#xff1a; 代码实现&#xff1a; 三、日期差值 问题描述&#xff1…

FIFO架构专题-异步FIFO及信号

概述 FIFO按时钟可分为&#xff1a;异步FIFO、同步FIFO。 定义 同步FIFO&#xff1a;读时钟和写时钟都相同的FIFO。同步FIFO内部没有异步处理&#xff0c;因此结构简单&#xff0c;资源占用较少。 异步FIFO&#xff1a;读时钟和写时钟可以不同的FIFO。异步FIFO内部有专门的异…

类和对象(上)--类、类的实例化(对象)、this指针

1.类 1.1定位&#xff1a; 和namespace一样&#xff0c;类也有类域。同样起到既保护又限制的功能。别人不能随意访问类里的东西&#xff0c;得通过特定的方式来访问&#xff08;访问方法和命名空间域一样&#xff0c;三种方法&#xff09;。 1.2作用 在C语言中&#xff0c;…

Leetcode 路径总和

使用递归算法 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 如果节点为空&#xff0c;返回falseif (root null) {return false;}// 如果是叶子节点&#xff0c;检查路径和是否等于目标值if (root.left null && root.right null) …

程序里sendStringParametersAsUnicode=true的配置导致sql server cpu使用率高问题处理

一 问题描述 近期生产环境几台sql server从库cpu使用率总是打满&#xff0c;发现抓的带变量值的慢sql&#xff0c;手动代入变量值执行并不慢&#xff0c;秒级返回&#xff0c;不知道问题出在哪里。 二 问题排查 用扩展事件或者sql profiler抓慢sql&#xff0c;抓到了变量值&…

传输层协议TCP

一.TCP协议格式 对于传输层协议我们之前是学过了UDP&#xff0c;对于传输层协议是存在了一定的了解的&#xff0c;所以现在我们再来看TCP协议格式&#xff1a; 我们之前学过UDP的报文格式&#xff0c;所以源端口和目的端口是不需要进行再次讲解的&#xff0c;对于32序号和确认序…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…

前端框架Vue3基础部分

什么是Vue&#xff1f; Vue是一个能用于构建用户交互页面&#xff08;动态网页&#xff09;的渐进式JavaScript框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用性强的Web前端框架。 Vue的设计模式&#xff1f; Vue的设计模式&#xff1a;MVVM模式 MVVM设计模…

安达发|APS自动排程软件异常预警处理场景介绍

APS生产排单软件通过预先设定好相关基本资料与约束规则&#xff0c;当订单、机台、工具、材料、上下班时间等任何影响生产计划的因素变化后&#xff0c;只需执行“一键式排程计算”&#xff0c;系统即可生成相应的生产计划。它不仅能够高效地安排生产任务&#xff0c;优化资源分…

在阿里云快速启动Appsmith搭建前端页面

什么是Appsmith Appsmith是一个开源的低代码开发平台&#xff0c;它使得开发者能够快速地构建内部工具、业务管理系统、CRM系统等。Appsmith通过提供一系列预建的UI组件&#xff08;如表格、图表、表单等&#xff09;&#xff0c;以及对数据库、API调用的直接支持&#xff0c;…

命令执行简单(棱角社区有毒)

前言&#xff1a;小迪安全2022第一节反弹shell&#xff0c;小迪用的是两台都是云服务器&#xff0c;没有服务器可以在自己的主机上搭建也是可以的&#xff0c;主机上搭两个网站 思路&#xff1a;生成一个木马文件&#xff0c;下载到本机&#xff0c;然后利用本机上传到目标主机…

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案 需求场景以及先决条件默认方案改造思路改造代码,一共4个类需要变更完整需要修改的代码 需求场景以及先决条件 同一环境下的多个ruoyi项目,各自使用相同的一组用户(我这里用的是LDAP的登录,不影响本文),但是每个权限拥…

图像/文字差异类型验证码识别 无需训练

某像差异在个别全家桶验证方便有使用&#xff0c;对于这种验证码类型如下&#xff1a; 首先还是目标检测&#xff0c;直接用 dddd 自带的detection 就足够了。 特征提取 其次经过观察&#xff0c;差异答案与其他三个无非就是颜色&#xff0c;字体&#xff0c;方向&#xff0c…

【AI+教育】一些记录@2024.11.16

《万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题》 万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题关于 ChatGPT 铺天盖地的信息让人无所适从。本文则试图提炼出五个关键问题&#xff1a;如何理解这次范式突破&#xff0c;未来能达到的技术天花板&#xff0c;行…

Java-04 深入浅出 MyBatis - SqlSessionFactory 与 SqlSession DAO与Mapper 代理模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

在Unity中使用Epplus写Excel

Overview 本文旨在帮助你快速入门,该库发展多年内容庞大(官方文档写的极好:https://github.com/EPPlusSoftware/EPPlus/wiki),有些功能在Unity环境可能你永远都不会使用. 官方的一个Demo: https://github.com/EPPlusSoftware/EPPlus.Samples.CSharp 如果你只有读的需求,可以…

leetcode 删除有序数组的重复项

26. 删除有序数组中的重复项 已解答 简单 相关标签 相关企业 提示 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

HNUST-党校培训自动下一集油猴脚本

1.起初 好烦&#xff0c;这个系统看视频需要一直点按键&#xff0c;还没有自动下一集的功能&#xff0c;于是就有了这个js代码 2.效果 实现自动点击是否观看&#xff0c;检测按键自动播放下一集 3.代码(你需要下载油猴&#xff0c;打开管理面板&#xff0c;新建代码) // UserS…