`
山有峰则灵
  • 浏览: 28209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一道关于三角型的题

阅读更多
本题摘自 www.topcoder.com

题目如下:你有一个很多方形格子所组成的矩阵组,一些小方格是黑色的,一些是白色的,而一些是三角型的格子的,三角的格子可以任意90度的旋转也可以打开变成黑色的格子,但任何小格被放置好就不可以再移动

你的任务是找出在这个矩阵组中有多少个潜在的独立的三角型

我们会给你一组数组表示这个矩阵,其中'#' 代表黑色的方块,'/'代码三角型,'.'代表白色的方块

如图

将会被表示为{"#//#./#/#",

                         "####.#/##",

                         "...../#.#",

                         ".....####"}; 这样的一个矩阵,下面的图列将会分析出这个图里潜在的三角型数





如图所见,当我们获得这样的一个参数时,有且只有5个独立的三角型图案

以下给出一些类似的参数输入及输出

Constraints 
-  grid will contain between 1 and 50 elements, inclusive. 
-  Each element of grid will contain between 1 and 50 characters, inclusive. 
-  Each element of grid will contain the same number of characters. 
-  Each character in grid will be '.', '#' or '/'. 
Examples 
0)  
      {"//"}

Returns: 10



1)  
      {"#//#./#/#",
"####.#/##",
"...../#.#",
".....####"}

Returns: 5
This is the example from the statement. 


2)  
      {".#.",
"#/#",
".#."}

Returns: 0



3)  
      {".../...",
"..///./",
".//#/./"}

Returns: 46



如何来判断一个三角型是否是一个独立的三角型?

首先,一个独立的三角型,必须有2边不是连接着黑色的小方块的,也就是说直角边的2边必须要是空白的小方块,三角型,或者是墙。

可能你会马上这样考虑,那么我遍历这个矩阵,找到所有的三角型,毕竟只有找到三角型才能判断它的2边。但是这样做实际会让第二个问题(组合3角型)变得很麻烦,一个大三角型完全可以包含多个三角型,而且2个大直角三角型,可以组合成为一个等腰三角型。这些都让这个题目的难度增加了很多



请看这张图,恩,很丑:


从左边的图像可以看到1,1这个位置是一个黑色的方块,而1,2这个位置是一个三角型,他们分别属于2个直角三角型,但和在一起变成了一个大三角型,而0,1 和0,2 只有在倒立的情况下才能算一个独立的三角型,如现在所示他们只能贴着1,1这个黑色方块,所以它们无法算做一个三角型

右边的图有一个大三角型但如果你像现在这样放置那2个小的三角型,这这2个图案都不独立的三角型了,如果把那2个小三角型的方向变成 》 大三角型仍然是|— 则他们2 都是三角型,为2个不同的三角型



想了一天大概找到了一些判断的规则和解题的思路,PS:如果你有其他的做法不妨一起讨论下



1 三角型是可以旋转的,这里我们不旋转三角型,而是旋转整个矩阵,然后根据条件2,4找寻符合条件的项,一共旋转3次

2 如何判断一个三角型是一个小三角型,不考虑组合时,很显然,当它的2边为空,墙,三角型时条件成立。所以我们每次都查找三角型格的右侧和下侧,符合要求则成立,如果右侧为三角型还需在跳至规则3判断

3 两个小三角型紧贴在一起的时候有可能合并成为一个占2格的稍大一些的三角型,根据条件1,如果该小三角型的右侧为三角型,并且其下侧的2个格子任何一个都不为黑色方块 ,则成立。之后通过条件1旋转,检查另一个方向是否出现

4 直角大三角型,开始方块不能为空白方块,然后开始检查它所有的斜对角线,如果有空白方块则退出,如果检查到斜对角线全部为三角型方块,并且其不含空白方块,则再检查其2条直角边,跳至规则5

5必须判断大直角三角型的2个直角边,是否有黑色方块紧贴,如果有则该图形不是直角三角型,并跳至规则6继续判断

6 两个大直角三角型组成的三角型,如果一个大直角三角型一边含有黑色方块,那他很可能紧贴着另一个大直角三角型那么我们还需反向判断,看是否存在这样的一个映射三角型,判断参考规则4,5

解决问题的是人,不是程序



   代码如下:

public class RotatingTriangles {    
   
    int n = 0;    
    int m = 0;    
    String[] t_grid;    
        
    public static void main(String[] args){    
        String[] test1={"//"};    
        String[] test2={"#//#./#/#","####.#/##","...../#.#",".....####"};    
        String[] test3={".#.", "#/#",".#."};    
        String[] test4={".../...","..///./",".//#/./"};    
        //should output 10    
        new RotatingTriangles().count(test1);    
        //should output 5    
        new RotatingTriangles().count(test2);    
        // 0     
        new RotatingTriangles().count(test3);    
        //46    
        new RotatingTriangles().count(test4);    
    }    
        
    public int count(String[] grid) {    
        t_grid = grid;    
        int res = 0;    
        for (int i = 0; i < 4; i++) {    
            res += countTriangle(t_grid);    
            t_grid = rotate(t_grid);    
        }    
        return res;    
    }    
   
    public int countTriangle(String[] grid) {    
        t_grid = grid;    
        n = grid.length;    
        m = grid[0].length();    
        int res = 0;    
   
        for (int i = 0; i < n; i++) {    
            for (int j = 0; j < m; j++) {    
                char currentChar = getCV(i, j);    
                if (currentChar == '/') {    
                    if (j + 1 < m) {    
                        if (i + 1 < n) {    
                            if (getCV(i, j + 1) == '.'&& getCV(i + 1, j) != '#'){ res++;}    
                            if (getCV(i, j + 1) == '/'&& getCV(i + 1, j) != '#'){    
                                res++;    
                                if(getCV(i + 1, j + 1) != '#'){ res++; }    
                            }    
                        } else {    
                            if (getCV(i, j + 1) == '.'){ res++;}    
                            if (getCV(i, j + 1) == '/'){ res+=2;}    
                        }    
                    } else {    
                        if (i + 1 < n) {    
                            if(getCV(i + 1, j) != '#'){res++;}    
                        } else {    
                            res++;    
                        }    
                    }    
                }    
                    
                // judge the big T    
                int a = i + 1, b = j + 1;    
                boolean whileflag = true;    
                    
                while (a < n && b < m && whileflag && currentChar != '.') {    
                        
                    char c = checkDiagonal(a,b,i,j,false);    
                        
                    if(c=='.') break;    
                        
                    if (whileflag && c == '/') {    
                        if (i - 1 >=0) {    
                            whileflag = checkHorizontalLine(i-1,j,b);    
                            if (whileflag) {    
                                if(j-1>0){    
                                    for (int h = i; h <= a; h++){    
                                        if (getCV(h, j - 1) == '#') {    
                                            whileflag = false;    
                                            break;    
                                        }    
                                    }    
                                }    
                            }    
                            if(b-j<=j){    
                                if('/'==checkDiagonal(a,b,i,j,true)){    
                                    if(checkHorizontalLine(2*j-b,j,j-1))    
                                        res++;    
                                }    
                            }    
                        }    
                        if (j - 1 >= 0&&whileflag) {    
                            for (int h = i; h <= a; h++){    
                                if (getCV(h, j - 1) == '#') {    
                                    whileflag = false;    
                                    break;    
                                }    
                            }       
                        }    
                        if (whileflag) { res++; a++; b++;}    
                    }    
                        
                    if (whileflag && c == '#') {a++; b++;}    
                }    
            }    
        }    
        return res;    
    }      
   
    public char getCV(int n, int m) {    
        return t_grid[n].charAt(m);    
    }    
        
    public boolean checkHorizontalLine(int hight,int start,int end){    
        boolean flag=true;    
        for (int w = start; w <= end; w++){    
            if (getCV(hight, w) == '#') {    
                flag = false;    
                break;    
            }      
        }    
        return flag;    
    }    
        
    public char checkDiagonal(int a,int b,int i,int j,boolean inverse){    
        char c = '0';    
        if(inverse){    
            for (int x = a-1, y = j; x <= j && y >=a; x++, y--) {    
                if (c == '0') {    
                    c = getCV(x, y);    
                } else {    
                    if (getCV(x, y) == '.') {    
                        c='.';    
                        break;    
                    }     
                    c = getCV(x, y)== c ? c : '#';    
                }    
            }    
        }else{    
            for (int x = a, y = j; x >= i && y <= b; x--, y++) {    
                if (c == '0') {    
                    c = getCV(x, y);    
                } else {    
                    if (getCV(x, y) == '.') {    
                        c='.';    
                        break;    
                    }     
                    c = getCV(x, y)== c ? c : '#';    
                }    
            }    
        }    
        return c;    
    }    
        
    public String[] rotate(String[] grid) {    
        int h = grid.length;    
        int w = grid[0].length();    
        String[] temp = new String[w];    
   
        for (int i = 0; i < w; i++) {    
            String s = "";    
            for (int j = 0; j < h; j++)    
                s += grid[j].charAt(i) + "";    
            temp[w - i - 1] = s;    
        }    
        return temp;    
    }    
}  
 
3
0
分享到:
评论

相关推荐

    三角形的面积练习题及答案北师大版精选.doc

    **第三题**:这是一道涉及三角形面积和倍数关系的问题。已知高是20米,底是高的1.4倍,即底为20 * 1.4 = 28米。所以面积 = (28 * 20) / 2 = 280平方米。 **第四题**:这个题目不仅涉及到面积计算,还与实际应用相...

    寻找问题关键点,多角度合理转化——对一道解三角形模拟题的深度学习.pdf

    本文主要探讨的是如何通过深度学习的方法来解决一道解三角形的模拟题,题目涉及的关键点是如何寻找问题的核心并进行多角度的转化。文章以2019年6月的一道具体问题为例,深入分析了解决这类问题的策略。 首先,问题...

    七年级数学下册第九章三角形9.1三角形的边由一道习题想到的素材新版冀教版

    首先,我们接触到一道典型的问题:已知三角形三个内角的比例为1:2:3,如何求解各角的度数?在解决这个问题时,我们必须先回顾三角形内角和的定理:任意一个三角形的三个内角之和恒等于180度。由此出发,若将三个内角...

    初三数学直角三角形考试题.docx

    这篇文档主要涵盖的是初三数学关于直角三角形的相关考试题目,包括了判断题、选择题以及几何图形问题。这些问题涉及到直角三角形的性质、全等三角形的判定、等腰三角形的性质以及实际应用问题。 1. 题目涉及到对顶...

    相似三角形性质的练习题.doc

    10. **正方形与等腰直角三角形的关联**:在最后一道解答题中,正方形ABCD和等腰直角三角形DEF的组合产生了新的相似三角形。首先,要证明两个三角形全等,然后利用全等三角形的性质来证明另外两个三角形相似。 通过...

    八年级数学全等三角形练习题含答案-全等图形练习题.doc

    以一道典型的解答题为例,题目可能要求证明三角形中的两条线段BD和CE相等。学生可以通过证明ΔABD和ΔACE全等,进而根据全等三角形对应边相等的性质,得出BD=CE。在解决这类题目时,学生需要仔细分析图形,识别出...

    强化问题探究促进“深度学习”发展核心素养——由一道“解三角形”试题的探究教学引发的思考.pdf

    文件中通过一道“解三角形”试题的探究教学引发的思考,反映了如何在数学教学中运用问题探究法来促进学生的深度学习。 在数学教育中,探究学习是一种有效的教学方法,它要求学生像数学家一样思考,通过提出问题、...

    (完整版)全等三角形证明经典30题.docx

    25. 第二十五题,涉及到等腰三角形和相似三角形,可能需要用到等腰三角形性质和相似三角形比例关系。 26. 第二十六题,通过线段相等和角平分线,可能需要用到全等三角形证明线段相等。 27. 第二十七题,角度、边长...

    福建省长泰高考数学一轮复习(解三角形)章节测试题.doc

    9. 第11题和第12题是关于三角形最大角的余弦值和最长边的计算,通常需要用到三角函数的性质,如余弦函数在第一象限的单调性。 10. 第13题和第14题涉及三角形的内角和为180度,通过角度的和差关系可以解出未知量。 ...

    相似三角形经典题(含答案).doc

    **例16**:这是一道较复杂的问题,涉及到勾股定理和相似三角形。可以通过构建辅助线和应用相似三角形的性质,来求解三角形的边长和高度。 通过这些经典题目的解答,我们可以深入理解相似三角形的性质,包括其在几何...

    人教版(五四制)七年级数学下册 第18章 全等三角形 单元检测试题 .docx

    - **第21题**:这是一道典型的证明题,要求学生能够运用已知条件和全等三角形的性质来进行推理证明。 - **第22题**:通过给出的具体条件,要求学生不仅能够证明两个三角形全等,还需要进一步探索线段之间存在的关系...

    安徽省各地2015届高考数学模拟试题分类汇编 三角函数、解三角形解答题

    在另一道模拟题中,考生需要通过三角形的面积公式来反推出边长。这种题目通常需要考生综合运用面积公式和三角函数定理,才能得出正确的答案。 正弦定理是解决三角形问题的核心公式之一,它表明在任何三角形中,各边...

    全等三角形压轴题.doc

    每一道题目的解析都围绕着全等三角形的性质和判定准则展开,涉及到了SAS、ASA、SSS等多种证明方法的应用。这些题目不仅考察了学生对于基本概念的理解,还考验了他们灵活应用几何知识解决问题的能力。

    三角形三边关系练习题.doc

    15. 这是一道创新题,PA+PB+PC&gt;(AB+BC+AC)意味着P点在三角形内部时,点P到三角形各边的距离之和大于三角形的周长。这可以通过三角形的内切圆性质或海伦公式来证明。 综上所述,这些练习题覆盖了三角形三边关系的...

    三角形中考压轴题(带答案).doc

    在一道选择题中,学生需要作辅助线构造全等三角形,利用ASA(角-边-角)全等条件来解决问题,并计算相应的四边形面积。这里不仅考验学生对于全等三角形判定方法的掌握,还要求他们能够灵活运用几何知识解决实际问题...

    初中数学解直角三角形测试题(卷).doc

    18. 这是一道利用勾股定理和直角三角形性质来求解未知边长和三角函数值的问题。 19. 折叠问题通常需要利用对称性来求解,这里要求三角形的面积和正弦值。 20. 高与斜边的比例关系,结合正方形的性质,可以求解BC的...

    全等三角形证明经典50题.doc

    以上只是对部分题目进行了简要解析,实际上每一道题都需要具体分析,利用全等三角形的判定定理,例如SSS(边边边)、SAS(边角边)、ASA(角边角)、AAS(角角边)等,以及相似三角形的性质进行证明。对于几何问题,...

    三角函数与解三角形高考试题精选.pdf

    第六题是一道关于直角三角形的问题,通过勾股定理和直角三角形的性质,我们可以求出BC的长度和sin2C的值。这类题目主要考察学生对于基本三角形性质的理解和应用。 第七题中给出了面积、边长差和cosA,要求解出a和...

    七年级下全等三角形练习题集经典题型综合拔高题.doc

    本文将对七年级下全等三角形练习题集中的一些经典题型进行综合分析,以加深对全等三角形性质和判定方法的理解。 首先,我们来回顾全等三角形的五种判定方法。SSS(三边相等)定理指出,如果两个三角形的三边分别...

Global site tag (gtag.js) - Google Analytics