贴瓷砖

来源:互联网 发布:24小时学通qt编程 编辑:程序博客网 时间:2024/04/27 20:05
小明家的一面装饰墙原来是 3*10 的小方格。
现在手头有一批刚好能盖住2个小方格的长方形瓷砖。

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

//240ms

//ans = 114434

#include <iostream>

#include <cstring>

#include <ctime>

using namespacestd;


int mp[5][12];

int ans = 0;

const int m4[][2] = {{1,0},{0,1},{1,1}};

const int put2[][2] = {{0,1},{1,0}};


bool checkrange(int x,int y)

{

    if (x <1 || x >3 || y <1 || y >10) {

        returnfalse;

    }

    returntrue;

}

bool check4(int x,int y)//颜色不相同返回false,相同返回true

{

    for (int i =0; i <3; i ++) {

        int tx = x +m4[i][0],ty = y +m4[i][1];

        if (mp[x][y] !=mp[tx][ty]) {//如果txty超范围,对2*2是否重色都不影响,所以不用判断。

            returnfalse;

        }

    }

    returntrue;

}


bool checkpos(int x,int y,int hv,int c)

{

    bool fg =true;

    int tx = x +put2[hv][0],ty = y +put2[hv][1];

    if (!checkrange(tx, ty)) {//但是在拼瓷砖即为mp赋值时,需要注意不能贴到范围以外。

        returnfalse;

    }

    if (mp[tx][ty] !=0) {//如果txty已贴瓷砖,则不能重复贴

        fg = false;

    }

    else {

        mp[x][y] = c;

        mp[tx][ty] = c;

        for (int i = x -1; i <= x; i ++) {

            for (int j = y -1; j <= y; j ++) {

                if (check4(i, j)) {//如果有重色,则不行

                    fg = false;

                }

            }

        }

        mp[x][y] =mp[tx][ty] =0;

    }

    return fg;

}

bool checkmap(){

    for (int i =1; i <=3; i ++) {

        for (int j =1; j <=10; j ++) {

            if (mp[i][j] ==0) {

                returnfalse;

            }

        }

    }

    returntrue;

}

void dfs(){

    if(checkmap()){//如果整面墙都贴了瓷砖,计数

        ans++;

        return;

    }

    for(int i=1;i<=3;i++){

        for(int j=1;j<=10;j++){//枚举可开始贴瓷砖的点,从左上向右下贴

            if(mp[i][j]==0){//如果该点可以贴

                for (int c =1; c <=2; c ++) {//颜色

                    for (int hv =0; hv <=1; hv ++) {//横着贴,或者竖着贴

                       if(checkpos(i, j, hv, c))

                       {

                           int tx = i +put2[hv][0],ty = j +put2[hv][1];

                           mp[i][j] = c;

                           mp[tx][ty] = c;

                           dfs();

                           mp[i][j] =0;

                           mp[tx][ty] =0;

                           

                       }

                    }

                }

                return;

            }

        }

    }

    return;

}

int main() {

    memset(mp,0,sizeof(mp));

    dfs();

    cout <<ans <<endl;

   return0;

}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 灰色针织运动裤洗完发黄怎么办 皮衣买大了一号怎么办 紧身衣破了一个洞怎么办 紧身衣破了一个小洞怎么办 内衣肩带不带调整的怎么办 不正确佩戴胸罩导致下垂怎么办 增肌时期晚上饿怎么办 啤酒和可乐喝了怎么办 脸部毛孔堵塞不出汗怎么办 减肥运动完饿了怎么办 想减肥晚上饿了怎么办 孕妇喝不进去水怎么办 跑步喝多了水怎么办 衣柜门轮子坏了怎么办 穿瑜伽裤下边有缝怎么办 3岁宝宝比较内向怎么办 我想和我同学搞基怎么办 自己做的葡萄酒太甜怎么办 吉米学校想退款怎么办 汽车租赁公司不退押金怎么办 身材不好怎么办健身教练形象照 反祈祷式做不到怎么办 窦性心跳过缓怎么办 四维彩超查出胎儿心脏有问题怎么办 减脂肚子饿了怎么办 做瑜伽腰扭到了怎么办 出了汗怎么办活动反思 农村都是老人和孩子怎么办 瑜伽垫容易出现痕迹怎么办 37岁失业了该怎么办 45岁找什么工作怎么办 华为手机4g网速慢怎么办 解析软件包时出现问题怎么办 一字马不能下去髋摆不正怎么办 练轮瑜伽骆驼式腰疼怎么办 感昌咳嗽老不好怎么办 我感昌一直不好怎么办 腰间盘突出晚上睡觉痛怎么办 天天吃撑了怎么办啊 一吸气就想咳嗽怎么办 鼻子堵住了怎么办没法吸气时