首页 > 其他分享 >luogu题解:P10456 The Pilots Brothers' refrigerator【缺少 SPJ】

luogu题解:P10456 The Pilots Brothers' refrigerator【缺少 SPJ】

时间:2024-08-09 16:38:26浏览次数:15  
标签:10 Brothers P10456 16 题解 复杂度 times 枚举 luogu

思路

此题题意酷似 P10449. 费解的开关。
https://www.luogu.com.cn/problem/P10449

不同之处便是状态连锁改变不同,但做法截然不同,此题是一个 \(4\times4\) 的矩阵。

暴力枚举的复杂度是 \(O( 10^7 )\) ,即 \(2^{16} \times 16\times16 = 16777216\) , \(10^7\) 的复杂度可以通过此题。

但费解的开关一题 为 \(5 \times 5\) 的矩阵,所以不可以暴力枚举。

枚举每个把手拉或不拉,每种拉完后的结果用二进制数 \(k\) 来表示(状态压缩), \(4\times4\) 个把手编号为 \(0\sim15\) ,输出时为 \((i \div 4+1,i \mod 4+1)\) 。

……具体细节看代码吧。

时间复杂度

\(O( 10^7 )\) ,即 \(2^{16} \times 16\times16 = 16777216\)

代码

#include<iostream>
#include<cstring>
using namespace std;
char c[4][4];
//目的:全部为'-'
int ans=16;//答案
int ansk=(1<<16)-1;//答案状态

void ch(char &c)//拉动单个把手
{
    if(c=='+') c='-';
    else c='+';
}

void trun(int x,int y)//连锁状态的改变
{
    for(int i=0;i<4;i++) 
    {
        ch(c[i][y]);
        ch(c[x][i]);
    }
    ch(c[x][y]);
}

void dfs(int u,int res,int k)//u表示当前编号,res表示已经拉动的个数,k表示二进制下的状态(一个16位的二进制数)
{
    if(u>15)//遍历完一遍
    {

        bool is_true=1;

        //判断是否合法
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
                if(c[i][j]=='+')//不合法
                {
                    is_true=0;
                    break;
                }

        if(is_true==1)
        {
            if(res<ans)//更新答案,注意ansk也要更新
            {
                ans=res;
                ansk=k;
            }
        }

        return ;
    }
    int x=u/4,y=u%4;//行为u/4,列为u%4
    trun(x,y);
    res++;
    k+=1<<u;

    dfs(u+1,res,k);//拉动此把手

    trun(x,y);
    res--;
    k-=1<<u;
    //还原现场

    dfs(u+1,res,k);//不拉动次把手
}
void nout()
{
    cout<<ans<<endl;

    for(int i=0;i<16;i++)
    {
        if(ansk>>i&1)//如果第i位为1,表示拉动了
        {
            cout<<i/4+1<<" "<<i%4+1<<endl;
            //注意:因为答案行列的编号从1~4,而我们存的是0~3,所以记得+1
        }
    }

}
int main()
{
    for(int i=0;i<4;i++)    cin>>c[i];//读入

    dfs(0,0,0);//从第0个开始枚举,已经拉动了0次,状态为0(什么都没拉)

    nout();//输出    

    return 0;
}

完结撒花。

标签:10,Brothers,P10456,16,题解,复杂度,times,枚举,luogu
From: https://www.cnblogs.com/yingxilin/p/18351006

相关文章

  • P2901题解
    题目大意输出一张有向带权图前k短路的长度思路分析这是道k短路板子题我们可以用Astar算法来实现它OIwiki相关算法的网页简单来讲,Astar定义了一个估值函数f(x)=g(x)+h(x)g(x)表示由起点到达x点的路程(不一定是最短路),而h(x)则是终点到x点的最短路程这个估值函数可以预估从该......
  • Codeforces 165E Compatible Numbers 题解
    思路高维前缀和高维前缀和把数的二进制看成一个集合,二进制的每一位为\(1\)为全集\(V\)。根据题目描述,若两数\(a,b\)相容,则\(a\operatorname{and}b=0\),容易发现,\(b\in\complement_{V}a\),所以我们只需要用高维前缀和处理出\(\complement_{V}a\)的一个元素即可。......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数\(l\)和\(r\)(\(l<r\)),令\(S(l,r)\)表示序列\((l,l+1,\ldots,r-2,r-1)\),其中包含从\(l\)到\(r-1\)的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为\(S(2^ij,2^{i}(j+1))\),......
  • AT_past202010_m 筆塗り 题解
    题目传送门前置知识线段树|树链剖分解法观察到要维护树上信息,且更改的呈链状,考虑进行树链剖分。将边权转化成点权,钦定边权给了深度更深的那个点,注意更新时不能更新\(\operatorname{LCA}\)。区间赋值和单点查询用线段树维护即可。代码#include<bits/stdc++.h>usingnam......
  • 如何避免自己问题解决缓慢导致项目周期延长
    在公司实习期间,我发现自己对业务的熟悉程度不足,导致在预期时间和实际完成时间上存在差异。虽然这种情况在后期有所改善,但前期的压力相对较大。为此,我总结了以下几点经验和改进措施:1.问题描述与现有分析我们今天的工作进展如何?当前诊断的调查进展如何?如果进展缓慢,是什么原因?需......
  • ABC349D题解
    [ABC349D]DivideInterval题解传送门:luogu|atcoder题目简述给定非负整数$l$和$r$($l<r$),令$S(l,r)$表示序列$(l,l+1,\ldots,r-2,r-1)$,其中包含从$l$到$r-1$的所有整数。此外,一个序列被称为“好序列”,当且仅当它可以表示为$S(2^ij,2^{i}(j+1))$,其中$i$和$j$......
  • # Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决
    Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决已经很晚了,刚刚解决这个问题,还是想记录一下,因为刚刚接触cocos没多久,这个问题困扰了我很久。背景接手了一个答题小游戏,由于涉及敏感信息就不在这里截图了,交接到我手里的是用cocos开发的,之前从来没有接触......
  • P8819题解
    题目大意现在有个有向图图,共有n个点,m条边总共有四种操作:操作1:将一条边打上标记操作2:将一个点出发的所有边打上标记操作3:将一条边移除标记操作4:将一个点出发的所有边移除标记打上标记的边视为被移除每次操作进行一次询问,如果每个点出度都是1,整张图是个强连通图,那么输出"YES......
  • 题解 洛谷P1478 陶陶摘苹果(升级版)
    题目传送门https://www.luogu.com.cn/problem/P1478截图来自洛谷:这道题就是这道题的升级版而已,我们可以定义一个结构体分别存抓当前苹果的力气与高度。之后进行从第1个苹果到第n个苹果的循环,判断当前苹果高度是否够,力气是否够。最重要的是要排序,因为要摘得苹果最多,所以要先......
  • Redis连接问题解决汇总
    Redis连接失败常见解决方案1.检查Redis命令行是否可以正常连接使用命令行客户端,输入:redis-cli-h虚拟机ip地址-p6379-aredis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接2.Redis命令行无法正常连接1)未打开Redis6379端口......