2023-3-29 每日一题 棋盘方格
文章目录
1. 题目描述
设有一个n*m方格的棋盘(1 <= m,n <= 100)。
求出该棋盘中包含多少个正方形、多少个长方形(不包括正方形)。
2. 输入格式
每个测试文件只包含一组测试数据,每组输入两个正整数 n 和 m。
3. 输出格式
对于每组输入数据,出该棋盘中包含的正方形个数和长方形个数。
4. 样例
4.1 输入样例
2 3
4.2 输出样例
8 10
5. 题解
5.1 纯暴力
5.1.1 文字描述
由于数据范围很小,N 和 M 最大只能取到100,因此直接循环枚举即可
四个参数可以确定一个长方形:左下顶点坐标 (x1,y1) 和右上顶点坐标 (x2,y2),也可以理解为左右下上 (x1,x2,y1,y2)。用四重循环,直接枚举 4 个参数,即两横边两竖边。
5.1.2 上代码
#include<iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
// 用于存储正方形和长方形的个数
int z = 0, s = 0;
for (int x1 = 0; x1 <= n ; x1++)
{
for (int y1 = 0; y1 <= m; y1++)
{
for (int x2 = x1 + 1; x2 <= n; x2++)
{
for (int y2 = y1 + 1; y2 <= m; y2++)
{
if (x2-x1 == y2-y1)
z++;
else
s++;
}
}
}
}
cout << z << " " << s;
return 0;
}
5.2 不那么暴力
5.2.1 文字描述
用两个循环枚举边长,若边长相等则为正方形,否则就为长方形,再分别计算个数即可。
5.2.2 上代码
#include<iostream>
using namespace std;
int main()
{
int n, m, c = 0, z = 0;
cin >> n >> m;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(i==j)
z += (n-i)*(m-j);
else
c += (n-i)*(m-j);
}
}
cout << z << " " << c << endl;
return 0;
}