题目描述
现有若干个长度为1的建材,用四根可以拼成一个边长为1的单位正方形(方型单元),而用7根和10根则可以分别拼出两个和三个方型单元,图形如下:
编程计算用这样的方式拼出N个正方形需要多少木棍? 要求用最少的根数。 例如:输入4,最少需要12根
输入格式
一个正整数N,表示需要的方型单元
输出格式
输出所需要的最少木棍数
输入输出样例
输入
4
输出
12
这道题乍眼一看,是不是一道找规律的题目呢?
我们先来列举一下
上面是正方形个数,下面是需要的材料个数
这下就找到规律了吗?
那么,这道题规律是不是从第3个正方形开始,依次+2+3+2+3呢?
当然不是
先来看一下以这种思路写成的代码:
#include<bits/stdc++.h>
using namespace std;
int a[10001]={0,4,7,10,12};
int main(){
int n;
cin>>n;
if(n<=4)cout<<a[n];
else{
int t=2;
for(int i=5;i<=n;i++){
if(i%2)a[i]=a[i-1]+3;//如果是奇数,加三
else a[i]=a[i-1]+2;//如果是偶数,加二
}
cout<<a[n];
}
return 0;
}
试一下,在8之前都没有什么问题,但我们输入9试一下
这段代码的输出是25,但是9个方形可以按照如下摆放,只需24个
这道题的真正规律是:不停地向正方形的方向拼凑,正方形的右上角和右下角加3,其余地方都加2
我们又要怎么判断右上角和右下角呢?
只需拿一个变量 t 记录当前最大正方形的边长, 第t*t+1个正方形就是右上角,第t*t+t个正方形就是右下角,拼完一个正方形, t 就加一
完整代码为:
#include<bits/stdc++.h>
using namespace std;
int a[10001]={0,4,7,10,12};
int main(){
int n;
cin>>n;
if(n<=4)cout<<a[n];
else{
int t=2;
for(int i=5;i<=n;i++){
if(i==(t+1)*(t+1))t++;
if(i==t*t+1||i==t*t+t)a[i]=a[i-1]+3;
else a[i]=a[i-1]+2;
}
cout<<a[n];
}
return 0;
}
希望这篇文章对你有帮助~