一
拿到题目老样子我还是喜欢先模拟一遍样例。
题目说给出一个棋盘方格让我们求这个棋盘方格里有多少个正方形,多少个长方形。题目特定跟我们讲了长方形不包括正方形,从小学的知识我们可以知道正方形是特殊的长方形。在这里顺着题目的走,我们先从发正方形开始。
二
我们从边长为1的正方形开始,
由图我们可以知道正方形的数量为8.
二
接下来就是找去所有的长方形
三
走了一边样例我们可以知道无论是找正方形还是长方形时我们都从边最小时开始找。
正方形:正方形四边相等,所以我们只能的边只能从1增长到min(n,m)
如果正方形的边大于这个最小值就会超出所给出图形的范围。所以这里我们要注意一下。
长方形:因为长方形中不包好正方形所以当长和宽相等是就不是长方形
四
在查找长方形的时候长和宽分别从1增长到n和m,但其中我们要判断长和宽是否相等。这就设计到遍历长方形的时候我们肯会找到正方形,那这说明什么,长和宽分别从1增长到n和m如果我们不对正方形进行判断的话就是寻找所有的长方形(这个长方形里面包括了正方形)。
五
因为正方形四边相等我们很容易就能找出数量。所以我们只需要找到所有的长方形(这个长方形并不是题目所说的长方形这其中包括了正方形)然后减去正方形我们就可以得到长方形(题目所指的长方形)的数量。
当我们只考虑一行时正方形边长从1开始如图根据一行中列数变化跟包含正方形的关系。
当正方形的边长为2时这个总体长方形的最小值为2,所以你n必须增长到2.
因为给出的是一个二维的图形,所以总的
正方形数量 = (n-i+1)*(m-i+1)
对于遍历所有的长方形(包括正方形的长方形)时因为长方形的长宽不一样所以分别用ij来表示。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
int zheng = 0;
int chang = 0;
int zong = 0;
int main(){
cin>>n>>m;
//求出所有正方形的数量
for(int i = 1;i<=min(n,m);i++){
zheng +=(n-i+1)*(m-i+1);
}
//求出所有长方形的数量这其包括正方形
//正方形是特殊的长方形
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
zong +=(n-i+1)*(m-j+1);
}
}
//如果在循环上面两个for循环时就判断是不是正方形就不用下面这个式子直接输出就可
chang = zong - zheng;
cout<<zheng<<" "<<chang;
return 0;
}