统计方形的数量
题目描述
有一个 n x m 的棋盘,问棋盘里有多少个正方形和长方形,长方形里不含正方形。
解题思路
一、枚举点位
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n, m;
cin >> n >> m;
ll suq = 0, rec = 0;
// 统计左上方的矩形数量,同理可统计左下、右上、右下,效果一致
for(int x = 0; x <= n; x++)
{
for(int y = 0; y <= m ; y++)
{
ll temp = min(x, y);
suq += temp;
// 矩形数量 = 所有不与当前点同行同列的点数量 - 方形数量
rec += x * y - temp;
}
}
cout << squ << endl << rec ;
return 0;
}
二、方形填充:枚举矩形, 类似滑动窗口
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n, m;
cin >> n >> m;
ll squ = 0, rec = 0;
for(int x = 1; x <= n; x++)
{
for(int y = 1; y <= m ; y++)
{
if (x == y) // 长宽相等, 正方形
squ += (n - x + 1) * (m - y + 1);
else // 长宽不相等 长方形
rec += (n - x + 1) * (m - y + 1);
}
}
cout << squ << endl << rec ;
return 0;
}
数学方法: 用线条组成矩形,横向选2条,竖向选两条
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
long long squ = 0, rec = 0;
//一层遍历即可, 长于宽相等
for( int x = 1; x <= min(n, m); x ++)
squ += (n - x + 1) * (m - y + 1);
rec = n * (n + 1) * m * (m + 1) / 4
cout << suq << ' ' << rec;
return 0;
}