完美的正方形分割

博客内容探讨了如何完美地分割正方形以匹配指定长方形,采用递归算法实现,通过穷举所有可能的正方形组合并检测是否能拼成目标形状。文章提供了C语言源代码,并展示了不同阶数的分割结果,同时提到了算法的时间效率问题,以及对优化的思考。
摘要由CSDN通过智能技术生成

完美的正方形分割:http://learning.sohu.com/20060329/n242511178.shtml

问题出处:http://topic.csdn.net/u/20071206/17/20f9fb73-7a11-4fab-92a4-f7a61a056c3f.html

解决办法:

先穷举出可能的正方形组合1   ,然后检测能不能拼成指定长方形2
程序用递归实现

1可能的组合:各正方形面积和与某个长方形面积相等,进行第一轮筛选

2就像用计算机玩只有大小不一的正方形的俄罗斯方块一样,搜索有没有解

c源代码:

#include  < stdio.h >
#include 
< math.h >
#include 
< time.h >
#include 
< assert.h >

const  MAXWIDTH  =   200 ;     // 最大宽度
const  MAXBASE  =   3 ;         // 最小正方形最大尺寸
const  RANK  =   10 ;         // 阶数
const  MARGIN  =   10 ;         // 长宽最大差值(0表示正方形)

int  square[MAXWIDTH];     // NUM个数的平方,优化效果微小
int  result[RANK];         // 可能的排列结果【0, rank-1】,从小到大

int  width, height;         // 宽、高
int  count  =   0 ;             // 穷举记数

int  flag[RANK];             // 代表被使用的顺序号(索引);值[0,rank-1],rank表示未使用,>rank做标记用于输出结果,例:flag[RANK-1]=0,表示最大的正方形放第一个
int  high[MAXWIDTH];         // 已被填放的高度表,比如9×10的长方形放置一个5×5,则数据为:[5 5 5 5 5 0 0 0 0 0] 
// 注意:这两个数组用于递归,每个递归使用退出后需要还原原值

void  perfectrect();
void  check();
void  search( int  n,  int  index,  int  sum);                     // 枚举正方形组合
bool  searchrect( int  n,  int  left);     // 判断能否填充

int  main( int  argc,  char   *  argv[])
{
    
int i;

    
//预处理
    for(i=1; i<=MAXWIDTH; i++)
    
{
        square[i] 
= i * i;
    }

    perfectrect();

    printf(
"Complete! ");

    
return 0;
}


void  perfectrect()
{
    
int sum;
    
int i;
    
static count2 = count;
    time_t t;
    time_t t2 
= 0;

    
for(width=20; width<MAXWIDTH; width++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值