小乐乐搭积木

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingongzi/article/details/84759184

链接:https://ac.nowcoder.com/acm/contest/301/B
来源:牛客网
 

题目描述

小乐乐想要给自己搭建一个积木城堡。

积木城堡我们假设为n*m的平面矩形。

小乐乐现在手里有1*2,2*1两种地砖。

小乐乐想知道自己有多少种组合方案。

输入描述:

第一行输入整数n,m。(1<=n,m<=10)

输出描述:

输出组合方案数。

示例1

输入

2 3

输出

3

说明

 
 

示例2

输入

1 3

输出

0

示例3

输入

2 5

输出

8

分析:dfs类型,不断搜索每一个点看是否可以拼一块,搜索方向为向下和向右,当面积为奇数时比如n=1,m=3此时不能拼完,组合方式为0。

代码如下:

#include<stdio.h>
int book[11][11],n,m,s,d,s1,dir[3][2]={{0,1},{1,0}};
void dfs(int pos,int cut)
{
    if(pos==s)
    {
        if(cut==s1)
        d++;
        return ;
    }
    int x=pos/m+1,y=pos%m,i,tx,ty;
    if(pos%m==0)
    {
        y=m;
        x=x-1;
    }
    if(book[x][y])
    {
        dfs(pos+1,cut);
        return ;
    }
    for(i=0;i<=1;i++)
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(tx<=n&&ty<=m&&book[tx][ty]==0)
        {
            book[x][y]=1;
            book[tx][ty]=1;
            dfs(pos+1,cut+1);
            book[x][y]=0;
            book[tx][ty]=0;
        }
    }
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    s=n*m;
    if(s%2)
    {
        printf("0\n");
        return 0;
    }
    s1=s/2;
    dfs(1,0);
    printf("%d\n",d);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bingongzi/article/details/84759184