首页 > 其他分享 >枚举大法

枚举大法

时间:2023-01-18 21:11:53浏览次数:44  
标签:大法 int flip 枚举 bitset line include change

一维密码锁(可能没有解)

第一个按钮按或者不按

#include<iostream>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;

int main()
{
    string line;
    bitset<32> lock;
    int mintimes=99999999;//无穷大 
    
    cin>>line;
    bitset<32> sourcelock(line);
    cin>>line;
    bitset<32> targetlock(line);
    
    int n=line.size();
    for(int p=0;p<2;++p)
    {
        lock=sourcelock;
        int times=0;
        int nextbutton=p;
        
        for(int i=0;i<n;++i)
        {
            if(nextbutton==1)
            {
                ++times;
                if(i>0)
                    lock.flip(i-1);
                lock.flip(i);
                if(i<n-1)
                lock.flip(i+1);
            }
            
            if(lock[i]!=targetlock[i])
                nextbutton=1;
            else
                nextbutton=0;
            if(lock==targetlock)        
            {
                mintimes=min(mintimes,times);
            }
        }
    }
        
    if(mintimes==99999999)
    {
        cout<<"impossible\n";
    }
    
    else
    {
        cout<<mintimes<<endl;
    }
}

 

二维熄灯问题

枚举第一行所有情况

#include<iostream>
#include<bitset>
#include<cstring>
#include<memory>
using namespace std;

bitset<6> source[5],lights[5],res[5],line;
int main()
{
    int T;
    cin>>T;
    for(int t=1;t<=T;++t)
    {
        for(int i=0;i<5;i++)
        {
            for(int j=0;j<6;j++)
            {
                int x;
                cin>>x;
                source[i].set(j,x);
            }
        }
    
        for(int n=0;n<64;++n)
        {
        for(int i=0;i<5;i++)    lights[i]=source[i];
        line=n;
        for(int i=0;i<5;++i)
        {
            res[i]=line;
            
            for(int j=0;j<6;++j)
            {
                if(line.test(j))
                {
                    if(j>0)        lights[i].flip(j-1);
                    lights[i].flip(j);
                    if(j<5)        lights[i].flip(j+1);
                }
            }
            
            if(i<4)        lights[i+1]^=line;
            line=lights[i];
        }
            if(lights[4].none())
            {
                cout<<"PUZZLE #"<<t<<"\n";
                for(int i=0;i<5;++i)
                {
                    for(int j=0;j<6;++j)
                    {
                        cout<<res[i][j]<<" ";
                    }
                    cout<<endl;
                }
                
            }
        }
        
    }
    
}

 

拨钟问题

九重循环枚举所有操作

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    int a[11];
    int change[11];
    int best[11];
    int minCount = 999999;
     for(int i = 1;i<=9;++i)
     {
         cin >>a[i];
     }
     memset(change,0,sizeof(change));
     int sum = 0;

         for(change[1] = 0;change[1]<4;change[1]++)
         for(change[2] = 0;change[2]<4;change[2]++)
         for(change[3] = 0;change[3]<4;change[3]++)
         for(change[4] = 0;change[4]<4;change[4]++)
         for(change[5] = 0;change[5]<4;change[5]++)
         for(change[6] = 0;change[6]<4;change[6]++)
         for(change[7] = 0;change[7]<4;change[7]++)
         for(change[8] = 0;change[8]<4;change[8]++)
         for(change[9] = 0;change[9]<4;change[9]++)
         {
             sum = 0;
             sum+= (a[1]+change[1]+change[2]+change[4])%4;//A只有1 2 4操作能改变A ,%4拨4次相当于没有拨 
             sum+= (a[2]+change[1]+change[2]+change[3]+change[5])%4;//B
             sum+= (a[3]+change[2]+change[3]+change[6])%4;//C
             sum+= (a[4]+change[1]+change[4]+change[5]+change[7])%4;//D
             sum+= (a[5]+change[1]+change[3]+change[5]+change[7]+change[9])%4;//E
             sum+= (a[6]+change[3]+change[5]+change[6]+change[9])%4;//F
             sum+= (a[7]+change[4]+change[7]+change[8])%4;//G
             sum+= (a[8]+change[5]+change[7]+change[8]+change[9])%4;//H
             sum+= (a[9]+change[6]+change[8]+change[9])%4;//I
             if(sum == 0)//能恢复 
             {
                 int count = 0;
                 for(int j=1;j<=9;j++)
                 {
                      count += change[j];
                 }
                  if(count < minCount)
                  {
                      minCount = count;
                      memcpy(best,change,sizeof(change));
                }
                for(int j=1;j<=9;j++)
                {
                      while(best[j]--)
                      {
                          cout << j<<" ";
                      }
                }
             }
         }
    return 0;
 }

 

标签:大法,int,flip,枚举,bitset,line,include,change
From: https://www.cnblogs.com/weinan030416/p/17060569.html

相关文章

  • C#使用枚举类型作为数据源
    C#使用Enum.GetValues<TEnum>()方法获取枚举数组集合TEnum[],基于此可使用枚举的所有类型作为下拉框等控件的数据源使用。1、枚举定义internalenumIconResolution{......
  • 16进制枚举状态机学习
    转自:https://blog.csdn.net/wodeni512517/article/details/711234691.介绍十六进制:typedefenum{ACTION_SHOWCARDS=0x01,//1ACTION_FOLLOW=0x02,//2A......
  • MybatisPlus通用枚举
    表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现。添加字段在数据库表添加字段​​sex​​altertablet_usermodifysexintnull......
  • MyBatis-Plus通用枚举
    创建通用枚举类型packagecom.atguigu.mp.enums;importcom.baomidou.mybatisplus.annotation.EnumValue;importlombok.Getter;@GetterpublicenumSexEnum{......
  • Java控制台摸鱼看书大法
    “本代码由摸鱼本鱼提供”老板:控制台虽然好看,也不能看一整天啊! (因为小说章节不准确,定位章节可能会有偏差,这个只能自己调整了)效果图:    废话不多说,直接上代......
  • leetcode 每日一题 gcd+枚举
    1819.序列中不同最大公约数的数目给你一个由正整数组成的数组nums。数字序列的最大公约数定义为序列中所有整数的共有约数中的最大整数。  例如,序列[4,6,16]......
  • 枚举类
    枚举类使用能够以调用属性的方式(类名.属性名)、调用元素的方式[](list[下标]、tuple[下标]、dict[key])、调用函数的方式(函数())来调用常量,方便常量的使用和管理fromenumim......
  • CF850B Arpa and a list of numbers 题解 枚举
    题目链接:https://codeforces.com/problemset/problem/850/B题目大意我们定义一个数列是”坏的数列”当且仅当这个数列不为空且数列中所有元素的最大公约数为\(1\)。......
  • SSIS【Foreach 循环容器_Foreach ADO 枚举器】(逐行读取某个表)
    SQLServer2008R2SSIS_Foreach循环容器_ForeachADO枚举器(逐行读取某个表)1.创建如下表:--droptablemytabcreatetablemytab(idint,namevarchar(30))insertinto......
  • SSIS【Foreach 循环容器_Foreach Item 枚举器】(循环读取数据库)
    SQLServer2008R2SSIS_Foreach循环容器_ForeachItem枚举器(循环读取数据库)1.首先在两个数据库中创建两个相同的表。下面将演示将这两个表的数据插入到test2中的一个新......