n*m棋盘的长方形个数和正方形个数

本文介绍了一种算法,用于计算任意给定大小的棋盘中包含的正方形和长方形的数量。通过具体的例子展示了如何计算边长为2×3的棋盘中的正方形与长方形数目,并提供了完整的Java程序实现。
问题描述
1.设有一个n*m方格的棋盘(1≤m,n≤100)。
求出该棋盘中包含多少个正方形、多少个长方形(不包括正方形)。
例如:当n=2,m=3时
正方形的个数有8个;即边长为1的正方形有6个;
边长为2的正方形有2个。
长方形的个数有10个;
即2*1的长方形有4个;
1*2的长方形有3个;
3*1的长方形有2个;
3*2的长方形有1个。
程序要求:输入:n和m 输出:正方形的个数与长方形的个数
输入格式
一行两个数N,M
输出格式
一行两个数,分别为正方形个数和长方形个数。
样例输入
2 3
样例输出
8 10
数据规模和约定
1≤m,n≤100
import java.util.*;
//x=min(m,n)-1 
//长方形里面数正方形的个数计算公式:m*n+(m-1)*(n-1)+.....+(m-x)*(n-x) 
// m*n表示长度为1的正方形的个数,(m-1)*(n-1)表示长度为2的正方形的个数。。。。。。
//长方形里面数长方形的个数计算公式(包含正方形):(1+2+3+...+m)*(1+2+3+...+n)=n*m(n+1)*(m+1)/4

public class Main3 {
	public static int N, M;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		M = sc.nextInt();
		int sumz = 0;
		int sumc = 0;
		if (N > M) {
			for (int i = M - 1; i >= 0; i--) {
				sumz += (N - i) * (M - i);
			}
		} else {
			for (int i = N - 1; i >= 0; i--) {
				sumz += (N - i) * (M - i);
			}
		}
		// 长方形个数
		sumc = N * M * (N + 1) * (M + 1) / 4 - sumz;
		System.out.println(sumz + " " + sumc);

	}

}

在 Java 中,计算棋盘正方形长方形的数量通常涉及到二维数组或者矩阵的操作。首先我们需要遍历每个位置(i, j),然后检查当前的格子与其相邻的格子能否组成一个正方形长方形。 对于正方形,我们可以找到所有边长相等的正方形个数。对于长方形,需要考虑对角线是否可以作为另一边的情况。这里提供一个简单的思路: 1. 对于每个点 (i, j),计算其边长 k 的最大值,使得 i - k >= 0 j - k >= 0,并且 i + k < n(n 是棋盘的行数) j + k < m(m 是棋盘的列数)。这个 k 就代表了以 (i, j) 为中心的正方形长方形的最大尺寸。 2. 然后计算从 k = 1 到 k = min(i, j) 的正方形数量,因为更大的边长不会构成新的正方形。每次增加 k,就对应一个新的正方形区域。 3. 长方形的情况类似,但是考虑到对角线,我们还需要额外处理 i == j 或者 |i - j| 的情况。 下面是一个伪代码示例: ```java int[][] board; // 棋盘矩阵 int n, m; // 行数列数 int squareCount = 0; int rectangleCount = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int maxSide = Math.min(i, j); // 取较小的边 for (int side = 1; side <= maxSide; side++) { // 从 1 到最大边长 if ((i - side) >= 0 && (j - side) >= 0 && (i + side) < n && (j + side) < m) { squareCount++; // 正方形 // 如果 i == j 或 |i - j| = side,则可能是长方形 if (Math.abs(i - j) == side || (i == j && side * 2 <= Math.min(i, j))) { rectangleCount++; } } } } } System.out.println("正方形数量: " + squareCount); System.out.println("长方形数量: " + rectangleCount); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值