求m行n列个方格的正方形总数

一个算法题: 一个m行n列的方格,问一共有多少个长方形和正方形?

我说下我的思路:
1、长方形和正方形类似,就是判断条件不一样而已。
2、先找出正方形数
  a、将m*n方格的图形每个点记录成(m+1)*(n+1)的矩阵,m行个格对应m+1行个点,n列类似。
  b、先以左下角第一个点为起点开始标记,记为(x11,y11)。
  c、寻找右上角的点,循环遍历除去标记点的所有点,当目标点(X,Y)满足 X-x11 = Y-y11 > 0, 数量加1.
  d、上一步遍历完成后,返回b,将起点变为(x12,y12),标记此点。
  e、当所有点都被标记后,结束程序。
3、长方形,就是将结束条件变为X-x11 >0 && Y-y11 > 0。

代码如下:

 1 package com.smikevon.basic.interview;
 2
 3 import java.util.LinkedList;
 4 import java.util.List;
 5
 6 /**
 7  * Created by fengxiao on 15-1-29.
 8  */
 9 public class SquareCount {
10
11     public static void main(String[] args){
12         System.out.println(count(5,2));
13     }
14
15     /**
16      * m行 n 列的方格
17      * @param m
18      * @param n
19      */
20     public static int count(int m,int n){
21         int total = 0;
22         List<Point> points = new LinkedList<Point>();
23
24         //将m行n列的方格,生成(m+1)*(n+1)个点
25         for(int i=0;i<=m;i++){
26             for(int j=0;j<=n;j++){
27                 points.add(new Point(i,j));
28             }
29         }
30
31         for(int i=0;i<points.size();i++){
32             for(int j=i+1;j<points.size();j++){
33                 if(points.get(i).formSquare(points.get(j))){
34                     total++;
35                 }
36             }
37         }
38         return total;
39     }
40
41
42     static class Point{
43         int x;
44         int y;
45
46         Point(int x,int y){
47             this.x=x;
48             this.y=y;
49         }
50
51         public int getY() {
52             return y;
53         }
54
55         public int getX() {
56             return x;
57         }
58
59         /**
60          * 判断和另一个点能否组成正方形
61          * @param point
62          * @return
63          */
64         public boolean formSquare(Point point){
65             int dx = point.getX() - this.getX();
66             int dy = point.getY() - this.getY();
67             return (dx==dy && dx>0)?true:false;
68         }
69
70         @Override
71         public boolean equals(Object o) {
72             if (x != this.x) return false;
73             if (y != this.y) return false;
74             return true;
75         }
76
77         @Override
78         public int hashCode() {
79             int result = x;
80             result = 31 * result + y;
81             return result;
82         }
83     }
84 }
时间: 2024-10-10 20:03:57

求m行n列个方格的正方形总数的相关文章

剑指Offer(Java版)第十二题:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38), 因为3+5+3+8=19。请问该机器人能够到达多少个格子?

/*地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动, 它每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子. 如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18.但它不能进入方格(35, 38), 因为3+5+3+8=19.请问该机器人能够到达多少个格子?*/public class Class12 { public int moveCount(int rows, int cols, int threshold){

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格, 但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37), 因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

package edu.bjtu.day8_27; import java.util.Scanner; /** * @author Allen * @version 创建时间:2017年8月27日 下午7:55:46 * 类说明:链接:https://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格, 但

[MySQL] 行列转换变化各种方法实现总结(行变列报表统计、列变行数据记录统计等)

前言: mysql行列变化,最难的就是将多个列变成多行,使用的比较多的是统计学中行变列,列变行,没有找到现成的函数或者语句,所以自己写了存储过程,使用动态sql来实现,应用业务场景,用户每个月都有使用记录数录入一张表,一个月一个字段,所以表的字段是动态增长的,现在需要实时统计当前用户使用的总数量,如果你知道有多少个字段,那么可以用select c1+c2+c3+-. From tbname where tid='111';来实现,但是关键是这个都是动态的,所以在应用程序端来实现确实不适宜,可以放

枚举N行N列的自然数列

数据库环境:SQL SERVER 2005 现有一个需求,要枚举1-50个自然数,分10行5列展示.如图, 解题思路: 1.利用数字辅助表,枚举1-50的自然数列 2.将数字集进行行转列,对5求余作为转列的条件,并按照整除5分组 SQL实现 /*枚举1-50的自然数列*/ WITH x0 AS ( SELECT number FROM master..spt_values WHERE type = 'P' AND number >= 1 AND number <= 50 ) /*行转列*/ S

Oracle 11g Pivot函数实现行转列

先上语法规范: SELECT .... FROM <table-expr> PIVOT ( aggregate-function(<column>) FOR <pivot-column> IN (<value1>, <value2>,..., <valuen>) ) AS <alias> WHERE ..... 通过一个例子说明其用法: select * from (select salary, department_id

sql语句备忘:非int类型行转列

如上图,result是varchar类型,需要行转列,百度到的都是对int类型的操作,折腾了很久,才整出来,在这里备个忘,不过据说性能方面堪忧,所以在这里也求看到大神指点指点,哪里还可以改进的,谢谢. 1 --不适用于有类型为text.ntext等不能执行distinct操作的字段 2 SELECT DISTINCT a.code, 3 (SELECT result FROM test b WHERE a.code=b.code AND b.type=1)AS'初审', 4 (SELECT re

SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择

原文:SQL Server 2008 R2--PIVOT 行转列 以及聚合函数的选择 ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性. 未经作者同意请勿修改(包括本声明),保留法律追究的权利. 未经作者同意请勿用于学术性引用. 未经作者同意请勿用于商业出版.商业印刷.商业引用. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文

在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串)

原文:在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 求SQL遍历截取字符串 http://bbs.csdn.net/topics/390648078 从数据库中读取某一张表(数据若干),然后将某一字段进行截取.比如:字段A    字段Ba/a/c      xa/b

SQL语句——08、聚集,分组,行转列

常用聚集函数 是对一组或一批数据进行综合操作后返回一个结果,如下: count 行总数 avg 平均数 sum 列值和 max 最大值 min 最小值 用法说明 count([{distinct|all} '列名'|*) 为列值时空不在统计之内,为*时包含空行和重复行 idle> select count(comm) from emp; COUNT(COMM) ----------- 4 idle> select count(ename) from emp; COUNT(ENAME) ----