第八届蓝桥杯C组B组(国赛)第二题 磁砖样式

Posted 给杰瑞一块奶酪~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八届蓝桥杯C组B组(国赛)第二题 磁砖样式相关的知识,希望对你有一定的参考价值。

小明家的一面装饰墙原来是 3*10 的小方格。

现在手头有一批刚好能盖住2个小方格的长方形瓷砖。

瓷砖只有两种颜色:黄色和橙色。

小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。

小明有个小小的强迫症:忍受不了任何2*2的小格子是同一种颜色。

(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)

显然,对于 2*3 个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】

技术分享图片

但对于 3*10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。

注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)

答案:(47分)

 

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#define xx 3
#define yy 4
using namespace std;
int s[5][12],c;
map<int,int> q;///每种摆放用01表示不同颜色,则可以组成不同的30位二进制数,标记每一种摆放是否重复(后面重复肯定是有的)
int check(int x,int y)///判断xy位置与周围形成的任何四个格子是否冲突
{
    for(int i = x - 1;i <= x;i ++)
    {
        for(int j = y - 1;j <= y;j ++)
        {
            int d = (s[i][j] == s[i + 1][j + 1]) + (s[i][j] == s[i][j + 1]) + (s[i + 1][j] == s[i][j]);
            if(d == 3)return 0;
        }
    }
    return 1;
}
int dele()
{
    int d = 0;
    for(int i = 1;i <= xx;i ++)
    {
        for(int j = 1;j <= yy;j ++)
        {
            d = d * 2 + s[i][j];
        }
    }
    if(q[d])
    {
        cout<<d<<endl;
        return 0;
    }
    return q[d] = 1;
}
void dfs(int x,int y)
{
    if(x == xx + 1)
    {
        if(dele())c ++;
        return;
    }
    if(s[x][y] == -1)
    {
        if(s[x + 1][y] == -1)
        {
            for(int k = 0;k < 2;k ++)
            {
                s[x][y] = s[x + 1][y] = k;
                if(check(x,y) && check(x + 1,y))dfs(x + y / yy,y % yy + 1);
            }
            s[x][y] = s[x + 1][y] = -1;
        }
        if(s[x][y + 1] == -1)
        {
            for(int k = 0;k < 2;k ++)
            {
                s[x][y] = s[x][y + 1] = k;
                if(check(x,y) && check(x,y + 1))dfs(x + y / yy,y % yy + 1);
            }
            s[x][y] = s[x][y + 1] = -1;
        }
    }
    else dfs(x + y / yy,y % yy + 1);
}
int main()
{
    for(int i = 1;i <= xx;i ++)
    {
        for(int j = 1;j <= yy;j ++)
        {
            s[i][j] = -1;
        }
    }
    for(int i = 1;i <= yy;i ++)
    {
        s[xx + 1][i] = -2;
        s[0][i] = -2;
    }
    for(int i = 1;i <= xx;i ++)
    {
        s[i][yy + 1] = -2;
        s[i][0] = -2;
    }
    dfs(1,1);
    cout<<c;
}

 

以上是关于第八届蓝桥杯C组B组(国赛)第二题 磁砖样式的主要内容,如果未能解决你的问题,请参考以下文章

第八届蓝桥杯国赛------磁砖样式

第八届蓝桥杯 JAVA(B组) 第二题“纸牌三角形”

第八届蓝桥杯决赛 磁砖样式

第八届蓝桥杯第二题

第八届蓝桥杯B组java第四题

第八届蓝桥杯b组java第六题