[软件能力测试]: 傻X盖章

题目:

有一个宽为W个小格,高为H个小格,总小格数为W*H的棋盘。棋盘中,可以被涂色的小格用"P"标识,不可以涂色的小格用"B"标识,可以涂色也可以选择不涂色的小格用"?"标识。如下W=5, H=4的棋盘

PPPBB

PP?BB

PP?PP

BBP?P

有一个傻X,手中有1*1 , 2*2, 3*3 等方形图章。这个傻X希望用手中的最大的图章,将棋盘中所有可以被涂色的P标识的方格都盖满。其中"?"标识的小格可以被涂色,也可以不被涂色。

上面W=5, H=4的棋盘,可以将涂色区域盖满的图章为3*3

求:傻X用最大的那个图章,可以将所有的P小格都盖上颜色,返回图章的边长

思路1:硬遍历+剔除无效的解

首先,先找出横向的连续区域,取其最小的那一个

然后以最小连续区域的最小值作为最大的图章

从左上角依次盖章:如果能盖下,就盖。不能的话顺序移动一个位置,继续盖

最后盖章完成后,检测是否有P格没有被盖上

代码:

    public static boolean CanBePaint(char[][] Canvas, int X, int Y, int Size){
        for(int i=X; i+Size < Canvas.length-1; i++){
            for(int j=Y; j+Size < Canvas[i].length-1; j++){
                if(Canvas[i][j] == ‘B‘){
                    return false;
                }
            }
        }
        return true;
    }

    public static char[][] Paint(char[][] Canvas, int X, int Y, int Size){
        for(int i=X; i+Size < Canvas.length-1; i++){
            for(int j=Y; j+Size < Canvas[i].length-1; j++){
                Canvas[i][j]= ‘#‘;
            }
        }
        return Canvas;
    }

    public static boolean CheckAllPaint(char[][] Canvas){
        for(int X=0;X< Canvas.length; X++){
            for(int Y=0;Y < Canvas[X].length; Y++){
                if(Canvas[X][Y] == ‘P‘){
                    return false;
                }
            }
        }
        return true;
    }

    public static int getMaxLength(char[][] Canvas){
        int iMaxTotal=0;
        int iMaxW=Canvas[0].length;
        int iMaxH=Canvas.length;

           int iMaxLine = 0;
        int iCounter  = 0;
        int pCounter = 0;

        for(int H=0;H< Canvas.length; H++){

            iMaxLine = 0;
            iCounter  = 0;
            pCounter = 0;

            for(int W=0;W< Canvas[H].length; W++){
                if(Canvas[H][W] ==‘P‘ || Canvas[H][W] ==‘?‘){
                    iCounter++;
                    pCounter++;
                    if(iMaxLine <iCounter ){
                        iMaxLine = iCounter;
                    }
                }
                else{
                    iCounter=0;
                }
            }

            //除去全是?的情况
            if(pCounter!=0){
                if(iMaxLine > iCounter  ){
                    iMaxLine = iCounter;
                }
            }
        }

        /*
        if(iMaxW > iMaxH){
            iMaxTotal = iMaxH;
        }
        else{
            iMaxTotal = iMaxW;
        }
        */

        return iMaxLine;
    }

    public static int SBPaint(char[][] Canvas){
        int Stamp = 1;

        int iMax = getMaxLength(Canvas);

        for(int Size = iMax;Size>1;Size-- ){
            char[][] TempCanvas = Canvas;
            for(int X=0;X+iMax < Canvas.length; X++){
                for(int Y=0;Y+iMax < Canvas[X].length; Y++){
                    if(CanBePaint(TempCanvas,X,Y,Size)){
                        TempCanvas = Paint(TempCanvas,X,Y,Size);
                    }
                }
            }

            if(CheckAllPaint(TempCanvas)){
                Stamp = Size;
                break;
            }
        }
        return Stamp;
    }

思路2:直接找出横向和纵向的连续区域,取其最小的那一个 (不知道这个对不对)

PS:此文为了纪念两个多月来的努力,感谢儿子昨天晚上仅哭闹了一次,让爸爸睡了个好觉。

时间: 2024-10-08 13:59:07

[软件能力测试]: 傻X盖章的相关文章

利用dd命令对Linux磁盘进行读写能力测试

在Linux中,对磁盘进行读写能力的测试,是一件非常必要的事情.虽然有一些很专业的软件去做这件事,但在某些情况下,由于技术能力限制,或用户并不需要很专业,这时就要考虑Linux内嵌命令dd了,它是一个简单易用,且功能略微强大的命令. 一.首先要了解两个特殊的设备 /dev/null:回收站.无底洞,可以把一些没用的东西丢进去 /dev/zero:产生字符,这样就可以模拟文件,不需要有文件就可以进行文件传输 二.读写能力测试 磁盘写能力测试: time dd if=/dev/zero of=/te

全程软件测试之测试需求分析与计划

全程软件测试之测试需求分析与计划 在项目启动之后,就要着手软件项目的计划,包括软件测试计划.软件测试计划是整个开发计划的组成部分,同时,它又依赖于软件组织过程.项目的总体计划.质量文化和方针.在测试计划活动中,首先要确认测试目标.范围和需求,其中"测试需求分析"是关键任务,然后在测试需求基础上制定测试策略,并对测试任务.时间.资源.成本和风险等进行估算或评估. 无论何时进行估算,我们都是在预测未来,并会接受某种程度的不确定性.软件项目计划的目标是提供一个框架,不断收集信息,对不确定性进

一个蛮好的测试软件,测试你是否具有超级预测力

人类超能力测试软件 MyMagic Verison 1.0 版本号1.0 本软件用来测试用户是否具有超级预测力的能力. 本软件测试用户是否可以正确预见软件已经产生的数字,从而推测用户是否具有超能力的可能. 本软件支持1位.2位.3位.4位数字预测的测试. 本软件同时可以记录当前用户的测试正确的分数和具有预测超能力的可能性的百分比. 本软件具有在线用户帮助的能力. 本软件是共享软件.作者吴健保留版权.禁止逆向工程.盗版和破解.允许传播本软件完整软件包.保留法律权利.2015.8 http://fi

【平差软件学习---科傻】三、平面导线平差

关键词:导线的网型怎么分析,附和导线用科傻怎么平差,闭合导线用科傻怎么平差,无定向导线用科傻怎么平差,支导线用科傻怎么平差, 等待已久20天假终于到来了,整天没日没夜的干活,倒并不是身体上累,而是心里真的是累了,是那种机器转不动的累,是那种鱼儿在河中想去大海的感觉,总觉的自己像个机器,被人操纵的机器. 导线平差软件有很多种 我选择科傻是因为,他能反映出很多相关数据,而且可靠稳定,但是他的年龄有点大,可能当时的输入方式有点累人.我仔细想了想,如果您会变成的话,您就能看出他的原始数据编辑就是我们现在

谈谈软件兼容性测试

1.软件兼容性测试兼容性测试之待测试项目在特定的硬件平台上,不同的应用软件不同,不同的操作系统平台上,在不同的网络等环境中能正常的运行的测试.兼容性测试的目的:带测试项目在不同的操作系统上正常运行,包括待测试项目能在同一操作系统平台的不同版本上正常运行:待测试项目能与相关的其他软件或系统的“和平共处”:带测试项目能在指定的硬件环境中正常运行:待测试项目能在没的网络环境中正常运行.兼容性测试无法做到完全的质量保证,但对于一个项目来讲,兼容性测试是一个必不可少的一个步骤. 2.WEB兼容性测试的主要

软件GUI测试中的关注点

[摘要] 本文列数了软件黑盒测试过程中,在被测试软件中可能存在的常见软件问题.本文不会详细讨论基本的软件测试思想与常用技术,仅针对在软件黑盒测试过程中若干的问题做描述,并提供个人的参考测试意见与防范意见,希望可以为初学者提供些许帮助. [关键词] 软件测试,黑盒测试 [引言]不能不说的二个问题 ● 软件测试中的“二八”原则 80%左右的错误在进行用户测试之前已经被发现,而在剩余20%左右的错误中,存在80%左右的显性错误,剩余20%左右的错误是较难发现的隐性错误.这条原则源自经济学的80-20原

[转载]软件功能性测试21个故障模型

非本人原创,从51Testing软件测试网载入,再次感谢原创   测试的目标是要发现错误,因此在编写测试用例的时候也要遵循这个目标,尽量在软件的最薄弱环节多编写测试用例.虽然测试时有很多单个输入变量.多个输入变量的组合,但优秀的软件测试人员不会依靠运气,他们有着丰富的经验和直觉,可以从中找到哪些是需要进行测试的,哪些不需要测试,哪些操作可能会引起软件失效.把这些测试人员的经验和直觉尽量归纳和固化,就形成了一些故障模型.故障模型指明了故障是如何以及为什么会在软件执行时引起软件失效.在测试过程中,我

过渡期间的测试:外包软件的测试标准(译)

在信息技术外包世界,对一个公司拥有它的应用程序和被其他人开发或者维护的框架是普遍的.当销售商完成这个生意,一个普通的实验是把测试过渡活动当成是一个整体.你如何设计一个传统实验的可接受标准以至于它可测试并且被清晰沟通? 作为测试,我们通常讨论当一个应用程序被创建时如何接近测试并且被在我们自己公司内的团队维护,但是我们很少讨论当从一个外包供应商到另一个变化时发生了什么. 在信息技术外包的世界,对一个公司拥有它的被其他人开发和维护的应用程序和架构是普遍的.当销售商完成这笔生意,有合同涉及组建管理,实时

敏捷软件开发 - 测试

测试驱动开发 简单的3条测试规则: 除非已经编写了一个不能通过的单元测试,否则不编写任何产品代码: 只要编写能够正好导致测试不通过或者编译失败的单元测试就够了,无需更多: 只要编写能够正好使失败的单元测试通过的产品代码就够了,无需更多. 第一个也是最明显的一个效果,是程序中的每一项功能都有测试来验证它的操作的正确性.这个测试套件可以给以后的开发提供支援.无论何时我们因疏忽而破坏了某些已有的功能,它就会告诉我们.我们可以向程序中增加功能,或者更改程序结构,而不用担心在这个过程中会破坏重要的东西.测