写点什么

贤鱼的刷题日常 --P1548 [NOIP1997 普及组] 棋盘问题

作者:贤鱼很忙
  • 2022-10-12
    新疆
  • 本文字数:941 字

    阅读完需:约 3 分钟

🏆今日学习目标:🍀学会棋盘问题和题目


@TOC

题目

设有一个 N×M 方格的棋盘(1≤N≤100,1≤M≤100)求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。例如:当 N=2,M=3 时:正方形的个数有 8 个:即边长为 1 的正方形有 6 个;边长为 2 的正方形有 2 个。长方形的个数有 10 个:即 2×1 的长方形有 4 个 1×2 的长方形有 3 个:3×1 的长方形有 2 个:3×2 的长方形有 1 个:如上例:输入:2,3 输出:8,10 输入格式 N,MN,M 输出格式正方形的个数与长方形的个数输入输出样例输入 #1 复制 2 3 输出 #1 复制 8 10

思路

首先解决正方形:边长为 1 nm 边长为 2 (n-1)(m-1)边长为 3 (n-2)(m-2)........所以正方形就出来了,z(储存正方形个数)=nm;n--,m--下面来处理长方形长 1 有 n 个长 2 有 n-1 个

长 n 有 1 个长 m 同上所以长 n 的矩形就为 1+2+3+...n=(n+1)*n/2m 同上所以矩形的个数为 (m+1)m(n+1)*n/2/2 最后减去前面的正方形就出来了

==这个搞不懂没关系,还有方法==数据范围这么小???暴力直接做 i 0 - nj 0 - mk i+1 - nw j+1 - m 这样子当 k-i 等于 w-j 的时候,说明长宽相等(正方形),其余的不就是长方形??i,j 从 0 开始因为这样子就包括了边长为 1 的正方形和长方形

<font color="gree">AC</font>代码

公式法

#include<cmath>#include<cstdio>#include<cstring>#include<iostream>using namespace std;int z=0,c=0;//分别储存正方形,长方形int main(){  int n,m;  cin>>n>>m;  int f=0;  int nn=n,mm=m;//单独拿出来,不影响后面矩形的计算  while(f==0){    z+=mm*nn;    mm--,nn--;//如上文所说    if(mm==0||nn==0) f=1;//如果有一个为0,说明正方形最大的边长到了,就该结束循环了  }  c=(n+1)*n*(m+1)*m/4;//如上文所说  cout<<z<<" "<<c-z;}
复制代码

暴力法

#include<cmath>#include<cstdio>#include<cstring>#include<iostream>using namespace std;int z=0,c=0;int main(){  int n,m;  cin>>n>>m;  for(int i=0;i<=n;i++){    for(int j=0;j<=m;j++){      for(int k=i+1;k<=n;k++){        for(int w=j+1;w<=m;w++){//解析如上          if(k-i==w-j)            z++;          else c++;        }      }    }  }  cout<<z<<" "<<c;}
复制代码


<font size="5">==🏆结束语==</font> 如果喜欢的话可以订阅一下专栏,持续更新!!



发布于: 刚刚阅读数: 4
用户头像

贤鱼很忙

关注

为了未来奋斗中 2022-09-28 加入

主修网络安全和c++方面内容,时常提供题解和网络安全方面知识

评论

发布
暂无评论
贤鱼的刷题日常--P1548 [NOIP1997 普及组] 棋盘问题_10月月更_贤鱼很忙_InfoQ写作社区