首页 > 其他分享 >291 蒙德里安的梦想

291 蒙德里安的梦想

时间:2022-11-03 22:34:20浏览次数:48  
标签:cnt 梦想 false 蒙德里安 int st 12 一列 291

f[i][j]表示第i列有来自上一列的j(用二进制表示有几行就有几位,1表示突起,0表示没有突起)的突起时有几种摆放方式
在确定几行几列的图之后,先预处理st数组,这个数组是确定每一列可以怎么放(不能有奇数个连续的0)
比如在n=4的时候 有十五个状态
st[0] = 1, st[1] = 0, st[2] = 0, st[3] = 1, st[4] = 0, st[5] = 0, st[6] = 0, st[7] = 0, st[8] = 0, st[9] = 1, st[10] = 0, st[11] = 0, st[12] = 1,
st[13] = 0, st[14] = 0, st[14=5] = 1,
只有 0:(0000)2
        3:(0011)2
        9:(1001)2
        12:(1100)2
        15:(1111)2
表示当前这一列可以有这几种放的方式(1表示突出,0表示不突出)
预处理结束之后
先将f[0][0]置为1因为这表示第零列没有突出只有一种摆放方式
然后开始遍历m列,每一列(2n-1)需要遍历
上一列的突出与这一列的突出没有冲突并且st[j|k](也就是两个突起与起来还符合st规则)就算一种方法

#include<bits/stdc++.h>
using namespace std;

const int N = 12, M = 1 << N;

int n, m; // n是列
long long f[N][M]; //   N是列 M用二进制表示所以需要往左移N位每一位表示当前这一行有没有突出
bool st[M]; 

int main() {
    while( cin >> n >> m, n || m) {
        
        memset(f, 0, sizeof f);
        //预处理st 表示那些情况是可以的
        for (int i = 0; i < 1 << n; i++) {
            st[i] = true;
            int cnt = 0;   //表示当前连续零的个数

            for (int j = 0; j < n; j ++) {
                if (i >> j & 1) {  // 如果当前这一位是一
                    if (cnt & 1) {
                        st[i] = false;   //cnt & 1 如果cnt是奇数那么这个与就是一 如果cnt是偶数这个与就是零
                        break;                        
                    }
                }
                else cnt ++ ;
            }
            
            if (cnt & 1) st[i] = false;  //如果最后一位是奇数也置为false
        }
        f[0][0] = 1;
        for (int i = 1; i <= m; i++) {
            for (int j = 0; j < 1 << n; j++) {
                for (int k = 0; k < 1 << n; k++) {
                    if ((j & k) == 0 && st[j|k]) f[i][j] += f[i - 1][k];
                }
            }
        }
        cout << f[m][0] << endl;
    }
}

标签:cnt,梦想,false,蒙德里安,int,st,12,一列,291
From: https://www.cnblogs.com/echoT/p/16856079.html

相关文章

  • 【XSY2912】reo(构造)
    考虑先找到一个原树的根。对于第一种限制,\(b\)不能作为根。对于第二种限制,\(a\)不能作为根。找到可以作为根的一个点\(rt\),显然由于限制互不矛盾肯定能找到。对于第......
  • uva 1291
    游戏者必须按照这个序列一次用某一只脚踩相应的踏板。在任何时候,两只脚不能在同一个踏板上,但可以同时在中心位置0。每一个时刻,HH必须移动他的一只脚去踩相应的箭头,另一只脚......
  • 我的梦想是拥有自己的个人网站,分享我的所思所想!
    作者:沈豪,上海财经大学,Datawhale成员centos服务器上能配置多网站多证书啦!再也不愁网站配置问题了!!前言:作为一名大四的本科生,我的梦想是拥有自己的个人网站,向所有人分享我的所......
  • 学习梦想家CMS内容管理系统-模板的使用
    准备网站下载器网上可以自己百度搜索,我使用的这个工具就是HTTrackWebsiteCopier,通过这个工具完成一个网站的获取,主要是获取静态文件。这里需要自己去分析这个静态文件......
  • 学习梦想家CMS内容管理系统-环境启动
    ​gitee官网中项目的地址:​编辑 首先准备里面提到的工具​编辑其中JDK8和MySQL5.7我们已经有了,现在需要准备另外的工具。SpringToolSuite4(STS)安装过程......
  • Java获取当前系统事件System.currentTimeMillis()方法 ,获取当前时间戳10位 166529114
    Java获取当前系统事件System.currentTimeMillis()方法,获取当前时间戳10位1665291145转为时间字符串yyy-MM-ddSystem.currentTimeMillis()产生一个当前的毫秒,这个毫秒......
  • 追寻梦想,热爱技术
    此文是候捷老师关于职业的看法,我对文章做了精简,并结合自已的看法一、以兴趣为要点兴趣是最好的老师,找到自已的兴趣所在,并为之付出努力john也说过,他说他的两位获得图......
  • 雷军传-怀揣梦想,砥砺前行
    最近几天看完了一本书,是一本个人传记--《雷军传-站在风口上》,我总结为“怀揣梦想,砥砺前行”。其实在我高中时期就已经把雷军视为偶像,只不过当时这个偶像是从学习技术的角......
  • [转]https://blog.csdn.net/potato1992/article/details/113729111
    注意:ubuntu默认没有装gcc,运行下面教程脚本前,先要装好gcc$sudoapt-getinstallgcc 原文连接:https://blog.csdn.net/potato1992/article/details/113729111 ......
  • 唯青春与梦想不可辜负!
    青春转过头,发现青春已不在,混混噩噩地过了几年又几年,青春也就在其中偷偷消失。总有一件事在心头魂萦梦绕,也只有这一件事能让我燃起斗志,能在半夜想着,能孜孜不倦地坚持下去吧......