问题 B: 【递归】地盘划分--------------递归

题目描述
修罗王和邪狼被关进监狱,该监狱的地下秩序实际被不少暗势力所把持,这些暗势力根据其实力不同,划分出了大大小小的势力范围。具体划分方式是这样的:监狱是一个给定的矩形,每一个暗势力的势力范围都必须是一个正方形,划分时,最大的暗势力尽可能多地从矩形中划分一块正方形,接下来,第二大的暗势力在剩下的矩形中尽可能多的划分一块正方形……例如,图2.1中所示是一个3×4的矩阵,可最少划分为4个势力范围。

也就是说,取走一个3×3的正方形后,将问题规模变成3×1,然后变成2×1,最后变成1×1。规模每缩小一次,正方形的个数加1。

输入
两个int整数,即长和宽。
输出
正方形个数。
样例输入 Copy
3 4
样例输出 Copy
4

本题的解在最下面

对于内存128MB
解析:
很经典的题目。对于n<m 肯定删除 nn个格子,行数不变,列数-n
对于n>m 肯定删除m
m个格子 列数不变,行数-m
对于n==m 只有一种



#include<bits/stdc++.h>
using namespace std;
int n,m;
int  dfs(int n,int m,int sum)
{
    if(n<m) dfs(n,m-n,sum+1);
    else if(n>m) dfs(n-m,m,sum+1);
    else
    {
        cout<<sum+1<<endl;
    }
     
}
int main()
{
    cin>>n>>m;
    int sum=0;
    dfs(n,m,sum);
}

对于内存64MB
这是本题的解
s1表示小的边长。
s2表示大的边长。
s2%s1==0 说明肯定能被分成s2/s1个正方形。
如果s2%s1!=0,那我肯定可以删去s2/s1个格子,还剩s2%s1个格子

#include<bits/stdc++.h>
using namespace std;
int n,m;
int  dfs(int n,int m)
{
	int s1,s2;
	if(n==m) return 1;
	if(n<m)
	{
		s1=n;
		s2=m;
	}
	else
	{
		s1=m;
		s2=n;
	}
	if(s2%s1==0)return s2/s1;
	else
	{
		return dfs(s1,s2%s1)+s2/s1;
	}	
}
int main()
{
	cin>>n>>m;
	int sum=0;
	cout<<dfs(n,m)<<endl;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值