蓝桥杯:矩形切割问题(C++)

1、问题描述
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。

当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。
例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。

现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?

2、我对这个问题的理解
这个问题是要求我们模拟长方形切割的过程,最终完成把一个长方形切割成若干个正方形,并得到正方形的总个数。问题的关键就是如何保证每次切割的都是正方形,还有切割结束的条件判断。

3、解题思想
(1)首先是模拟切割过程,可以通过用长方形的长a去减去宽b,实现把一个长方形切割成一个长方形和一个正方形,其中切割得到的长方形的长为b,宽为a-b;得到的那个正方形边长为b(最大的);
(2)然后是切割结束条件的判断,在上述模拟切割的过程中长方形的长和宽在不断地变化,但当长和宽相等的时候就表明该次切割得到的是两个正方形,即切割结束。

4、注意点
(1)在切割的过程中,要保证动态变化的长方形的长一定要大于宽,不然会发生错误。
实现方法:在每次切割之前进行一次长和宽的比较。
(2)统计图形个数的计数因子num的初值应是1,因为图形在切割之前的个数也算图形的一个个数,然后每次切割,num加1。

5、实现代码

#include<iostream>
#include<cmath> 
using namespace std;

int calculate(int a,int b)       //定义计算正方形个数的函数calculate(),参数为起始长方形的长和宽; 
{	
	int num=1;                 //定义统计图形个数的变量num,并赋初值为1; 
	while(a!=b){               //当长和宽相等时,表明当前的图形为正方形,即切割街结束; 
	if(a<b){                   //判断此时长和宽,保证长大于宽,应为下面要用长减去宽(模拟切割过程); 
		swap(a,b);             //交换函数; 
	}
	a=a-b;                     //模拟切割的过程:长减去宽得到一个边长为b的正方形和一个长为b宽为a-b的长方形; 
	num++;                     //每切割一次,计数因子num加1; 
	}               
	return num;                //最后,函数返回总的正方形的个数; 
}

int main()
{
	int length=2019,width=324;     //定义题目所需的长和宽; 
	cout<<calculate(length,width); //调用calculate()函数计算; 
	return 0;
}

6、运行截图
(1)长为5,宽为3
在这里插入图片描述
(2)长为2019,宽为324
在这里插入图片描述
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家。(∩^∩)

发布了12 篇原创文章 · 获赞 3 · 访问量 393

猜你喜欢

转载自blog.csdn.net/weixin_45620022/article/details/104833325