• 求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 }
  • 相关阅读:
    C#LPT端口连接热敏打印机发送指令
    c# 普通打印机大致有三种方法(非热敏打印机及lpt1并口指令控制型)
    C#直接发送打印机命令到打印机(这里测试的是直接弹出钱箱操作)
    c#操作access,update语句不执行的解决办法
    element-ui dialog组件添加可拖拽位置 可拖拽宽高[转]
    [JavaScript] js实现简单的代码运行框【转】
    HTML5 drag & drop 拖拽与拖放简介[转]
    webpack 单独打包指定JS文件(转)
    跳转地图并定位
    基于Cesium实现逼真的水特效[转]
  • 原文地址:https://www.cnblogs.com/seanvon/p/4259392.html
Copyright © 2020-2023  润新知