问题 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;
}
发布了383 篇原创文章 · 获赞 7 · 访问量 8066

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104150644
今日推荐