进来你必懂的题解
2026-01-23 21:54:05
发布于:浙江
1阅读
0回复
0点赞
这题你别瞅它是个普及/提高-就害怕,这不纯数学题吗!
一个广场为n*m,那它最大的正方形边长也只有n和m中小的那个数,因此我们可以写:
int max=min(n,m);//可以直接写在for循环中
然后你想啊,这个正方形边长为1的时候,他可以在在总共n×m个地方,而当正方形边长为2时,是4个边长为1的正方形(以下简称小正方形),我们可以看作是左上角的小正方形向外加了一圈,形成2*2的正方形,也就是把左上角的小正方形当作中心点。那么当这个中心点在最后一行或最后一列的时候,外面那一圈超出范围了,所以中心点能在的长只有(n-2+1)个,宽只有(m-2+1)个位置,格子数为(n-2+1)(m-2+1)个。同理,当边长为3时,中心点只有(n-3+1)(m-3+1)个位置。
所以可以列出公式:边长为i时,有(n-i+1)(m-i+1)个位置。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;//输入长宽
int max=min(n,m);//找到最长边长
int sum=0;//累加器
for(int i=1;i<=max;i++){
sum+=(m-i+1)*(n-i+1);//此公式推导如上
}
cout<<sum;//输出
return 0;
}
没学会的……再看一遍!
跟着一只学c的熊解题你不点赞?
散会!
这里空空如也


有帮助,赞一个