子图数正方形和长方形数量

棋盘2

Description

设有一个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个)

Input

n和m。

Output

正方形的个数与长方形的个数。

Samples

input Copy

2 3

output Copy

8 10

#include <stdio.h>
int z=0,c=0;
void count(int n,int m);
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	count(n,m);
	printf("%d %d\n",z,c);
}
void count(int n,int m)
{
	int i,j,r,l;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			for(r=1;i+r<=n;r++)
			{
				for(l=1;j+l<=m;l++)
				{
					if(r==l)
						++z;
					else
						++c;	
				}
			}
		}
	}
}

就是子图概念,题目不要紧,要紧的是以坐标的概念,和图的行列结合起来的方法值,以坐标的动态变化来关联行列的动态变化,当然找规律也是行的就是要浪费很多时间,找错还要崩溃,这类题优先做法是类推,以前一步,推到后一步,加油。

在 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); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值