首页 > 代码库 > 求m行n列个方格的正方形总数

求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 m18      * @param n19      */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 point62          * @return63          */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         @Override71         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         @Override78         public int hashCode() {79             int result = x;80             result = 31 * result + y;81             return result;82         }83     }84 }

 

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