火柴棍问题

题目描述

现有若干个长度为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;
}

希望这篇文章对你有帮助~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值