标题:用汇编来写一个Leetcode的题目
只看楼主
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
结帖率:100%
 问题点数:0 回复次数:5 
用汇编来写一个Leetcode的题目
用汇编来写一个Leetcode的题目

Leetcode的题都可以用高阶语言来刷,可惜没有汇编,但没关系,写出结果也可以,于是找了几个算是有趣来玩一下,下面是其中一个.

题目
来源:力扣(LeetCode)
链接:https://

给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。



输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1]
表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)

这题思路挺多,大家可以想一下,如何用汇编写出来?
我这里已经写了一个简单的,为了方便,不用0,1,0,2,1,0,1,3,2,1,2,1这种无聊方式,改用全图示
左右键=水平选择那条柱子,上键=加长柱子,下键=减短柱子,空白键:显示/隐藏 雨水,ESC=离开



所有按键即时生效,并显示储水格数量.

大家有兴趣可以试写一下,可以不必用图示,写出思路也可以.代码约300行,回头再发.

搜索更多相关主题的帖子: 汇编 显示 思路 表示 高度 
2021-01-31 08:39
tigerdown
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2017-8-21
得分:0 
跟图形有关的汇编程序都是挺复杂的,要求对指令的运用非常熟悉,你在这方面非常擅长,我不行,我连题都看不懂,确实,我需要在方面加强和学习。
2021-02-17 07:58
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 2楼 tigerdown
嗯,其实这里没有用到绘图指令,那个实心方块和地面是ASCII的扩充字符,也是DOS页码437的区块元素(ASCII码号大于127),
在文字模式下,用字符显示函式显示就可以
MOV DL,219 ;实心=219,地面=176
MOV AH,2
INT 21H

或者在DOSBOX下,按着ALT不放,在右方的数字盘输入219,也可以显示一个实心方块

至于题目,也不难理解,就是数一下凹下去的坑中能容纳多少份水,因为两壁和坑深浅的改变,会令容水量改变.
原题目是柱子不变,长短柱子若是0,1,0,2,1,0,1,3,2,1,2,1....容水单位=6.
我只是改为柱子由用户自由改变,程式会即时计算容水单位并显示而已.

当然不必像我这像玩,也不必动态显示,能够
根据0,1,0,2,1,0,1,3,2,1,2,1...算出6
根据5,1,0,2,0,0,1,3,1,1,2,4...算出29
或者任意组合,再算出容水单位就可以.


2021-02-17 19:58
LHY163311
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2020-12-3
得分:0 
2021-03-09 16:30
热心网友
Rank: 1
来 自:河南鹤壁
等 级:新手上路
帖 子:21
专家分:0
注 册:2020-2-25
得分:0 
汇编语言太麻烦了,我用c先写下思路:
程序代码:
#include <stdio.h>

int TrappingResult(int height[],int len);           //总接水量
int CountTemp(int temp[],int len);                  //每行可接水量
int ArrMax(int height[],int len);                   //返回数组元素最大值
int main()
{
    int height[] = {0,1,0,2,1,0,1,3,2,1,2,1};
    int len = sizeof(height)/sizeof(int);           //数组长度
    int result = TrappingResult(height,len);        //结果
    printf("%d",result);
    return 0;
}

int TrappingResult(int height[],int len)
{
    int temp[len];
    int count = 0;
    int max = ArrMax(height,len);               //减少不必要的循环
    for(int i = 0;i < max;i ++)
        {
            for(int j = 0;j < len;j ++)
                {
                    temp[j] = height[j] > i?1:0;    //用循环化整为单,逐步计算
                }
            count+=CountTemp(temp,len);             //单个计算
        }
    return count;
}

int CountTemp(int temp[],int len)
{
    int head = 0,rear = -1;
    int count = 0;
    while(head < len-2)                 //当head指针大于数组长度-2时,不可能接到雨水
        {
            for(head = rear+1;head < len-1;head++)  //rear初始化为-1为了方便第一次循环
                {
                    if(temp[head] == 1)             //找到柱子
                        {
                            break;
                        }
                }
            for(rear = head;rear < len;rear++)      //寻找第二个柱子
                {
                    if(temp[rear+1] == 1)
                        {
                            count +=rear-head;      //计算接水量
                            break;
                        }
                }
        }
        return count;
}

int ArrMax(int height[],int len)
{
    int max=0;
    for(int i = 0;i < len;i ++)
        {
            if(height[i] > max)    max = height[i];
        }
    return max;
}

遍历数组的思想,
有待优化
2022-02-10 09:38
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 5楼 热心网友
思路不错,可以编译一下并输出结果
2022-02-18 06:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504784-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.098495 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved