poj 1020 Anniversary Cake DFS

–把一个大蛋糕(边长为E),能否切成给定s(s<=16)个边长为Ei(1=
•从左上开始切,寻找某列已切行数最少的开始,然后从大到小逐个试蛋糕,看是否能切出来,若当前切割失败,则回溯上一步,换个不同大小的继续试。切完需要的块数就表示刚好可以。 

贴一个看了大牛的代码以示敬意,当初确实没想到如此搜索的策略
#include 
#include 
int cakeside,piecenum,pieces[11];
//fillednum stand for the nums had filled
bool fill(int fillednum,int* used)
{
    //如果已填的个数等于需求的蛋糕个数则表示刚好
    if(fillednum==piecenum)
        return true;
    int i,j,minusedrow=41,nowcol=0;
    //寻找未填的行数最小的那列
    for(i=1;i<=cakeside;i++)
    {
        if(used[i]0;--i)
    {
        if(pieces[i]>0 && i+minusedrow<=cakeside+1 && i+nowcol<=cakeside+1)
        {
            bool flag=true;
            //判断连续的区域是否能放下当前蛋糕
            for(j=nowcol;jminusedrow)
                {
                    flag=false;
                    break;
                }
            }
            if(flag)
            {
                //能放下则更新蛋糕所在的列的已填行数
                for(j=nowcol;j0)
    {
        --ncase;
        int sum=0;
        int pieceside;
        scanf("%d %d",&cakeside,&piecenum);
        memset(pieces,0,sizeof(pieces));
        //记录各不同大小的蛋糕个数,大小范围在1-10之间
        for(i=0;i



你可能感兴趣的:(Search)