拼图

                      拼图

 

Description

 

给你1x2、2x1和2x2,3种矩形若干,请你计算出把它们放入2xn的矩形中,一共有多少方法?

 

 

Input

输入有多组测试数据
没行输入一个整数n , 3<=n<=20.

 

 

Output

输出能填满这个矩形的方法总数

 

 

Sample Input

 

3 
4

 

Sample Output

 

5
11

 

 

【解法一】

//DFS思想

 

# include<stdio.h>
# include<string.h>
int dir1[2][2]={{0,1},{1,0}};
int vis[2][30];
int cnt,ms,st,en;
int n;
int judge()
{
    int i,j,leap=0;
    for(i=0;i<2;i++)
    {
        for(j=0;j<n;j++)
        {
            if(vis[i][j]==0)
            {
                st=i;
                en=j;
                leap=1;
                break;
            }
        }
        if(leap==1)break;
    }
    return leap;
}
void dfs(int x,int y,int s)
{
    int tx,ty,i;
    if(judge())//找出最近的空缺位置
    {
        x=st;
        y=en;
        for(i=0;i<2;i++)
        {
            tx=x+dir1[i][0];
            ty=y+dir1[i][1];
            if(tx>=0&&tx<2&&ty>=0&&ty<n&&!vis[x][y]&&!vis[tx][ty])//填1x2和2x1图片时的搜索
            {
                if(s==ms-2)
                {
                    cnt++;
                    continue;
                }
                vis[x][y]=1;
                vis[tx][ty]=1;
                dfs(tx,ty,s+2);
                vis[x][y]=0;
                vis[tx][ty]=0;
            }
        }
        tx=x+1;
        ty=y+1;
        if(tx>=0&&tx<2&&ty>=0&&ty<n&&!vis[x][y]&&!vis[tx][ty]&&!vis[tx][y]&&!vis[x][ty])//填2x2图片时的搜索
        {
            if(s==ms-4)
            {
                cnt++;
                return;
            }
            vis[x][y]=1;
            vis[tx][ty]=1;
            vis[tx][y]=1;
            vis[x][ty]=1;
            dfs(tx,ty,s+4);
            vis[x][y]=0;
            vis[tx][ty]=0;
            vis[tx][y]=0;
            vis[x][ty]=0;
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        cnt=0;
        ms=2*n;
        memset(vis,0,sizeof(vis));//开始vis开大了,一直超时
        ds(0,0,0);
        printf("%d\n",cnt);
    }
    return 0;
}

 

【解法二】

//现在想一想,x轴一直都为2。如果放2x1,在y轴就占据了一个单位的位置;如果放1x2,就占据了两个单位的位置;放2x2也是两个

//那么如果确定放哪个,这样的空间位置内,一定就是放的它自身,如图Figure2;

//那么DFS就精简如下

 

# include<stdio.h>
int n,num;
int b[3]={1,2,2};
void dfs(int index)//只考虑横向(y轴)
{
    int i;
    if(index>n)
        return;
    if(index==n)
    {
        num++;
        return;
    }
    for(i=0;i<=2;i++)
    {
        dfs(index+b[i]);
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        num=0;
        dfs(0);
        printf("%d\n",num);
    }
    return 0;
}

 

【解法三】

//还有一种更绝的方法,从数据中找规律

//能得到f(n)=2*f(n-2)+f(n-1);

 

# include<stdio.h>
int f(int n)
{
    if(n==1)return 1;
    if(n==2)return 3;
    return 2*f(n-2)+f(n-1);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",f(n));
    }
    return 0;
}

 

 

 

 

 

posted on 2012-08-17 23:46  即为将军  阅读(394)  评论(0)    收藏  举报

导航