首页 > 编程语言 >acwing 116.飞行员兄弟 (算法竞赛进阶指南 p48 t1 ) 题解

acwing 116.飞行员兄弟 (算法竞赛进阶指南 p48 t1 ) 题解

时间:2023-08-12 21:45:15浏览次数:38  
标签:状态 进阶 16 题解 t1 枚举 把手 打开 acwing

原题链接

https://www.acwing.com/problem/content/description/118/

题目描述

“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。

已知每个把手可以处于以下两种状态之一:打开或关闭。

只有当所有把手都打开时,冰箱才会打开。

把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。

但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。

请你求出打开冰箱所需的切换把手的次数最小值是多少。

输入格式
输入一共包含四行,每行包含四个把手的初始状态。

符号“+”表示把手处于闭合状态,而符号“-”表示把手处于打开状态。

至少一个手柄的初始状态是关闭的。

输出格式
第一行输出一个整数N,表示所需的最小切换把手次数。

接下来N行描述切换顺序,每行输入两个整数,代表被切换状态的把手的行号和列号,数字之间用空格隔开。

数据范围:
1 <= i,j <=4

样例

输入样例

-+--
----
----
-+--

输出样例:

6
1 1
1 3
1 4
4 1
4 3
4 4

注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。


算法

思路

此题题意酷似 acwing 95. 费解的开关 https://www.acwing.com/problem/content/97/

不同之处便是状态连锁改变不同,但做法截然不同,此题是一个4*4的矩阵,
暴力枚举的复杂度是 O( 10^7 ), (2^16 * 16 * 16 = 16,777,216) ,10^7的复杂度可以通过此题。
但费解的开关一题 为5 * 5 的矩阵,所以不可以暴力枚举

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

……具体细节看代码吧

时间复杂度

O( 10^7 ) , 2^16 * 16 * 16 = 16,777,216

C++ 代码

#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;
}

求赞

本蒟蒻第一次写题解,如有问题请诸位dalao指正

给个赞吧

标签:状态,进阶,16,题解,t1,枚举,把手,打开,acwing
From: https://www.cnblogs.com/yingxilin/p/17625575.html

相关文章

  • IDEA/Android Studio的gradle控制台输出中文乱码问题解决
    原文地址:IDEA/AndroidStudio的gradle控制台输出中文乱码问题解决-Stars-One的杂货小窝在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变成乱码了..本篇就介绍下解决方法乱码效果如下图所示步骤我是window系统,不知道其他系统会不会出现这个问题乱......
  • Codeforces Round 874 G题解
    做不动那么多题了,来个GG就是问你一棵树能切成多少个大小为3的链,想了半天,想过dp啥的,但是后来发现这个贪心就好了,可以证明贪心找不到的,其他方法也找不到好久没复健了,这是第一次,感觉以后要多做题才可以#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(4e......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频云服务平台主子码流都为H.265时,切换出现花
    国标视频云服务LntonGBS平台是基于国标GB28181协议的平台,可实现的视频能力有:实时直播、视频录像、语音对讲、云存储、检索及回放、告警、级联等。平台支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。最近有用户反馈,在LntonGBS平台......
  • RTSP流媒体服务器LntonNVR(源码版)安防监控平台开启录像后,录像回看无数据的问题解决方案
    LntonNVR平台通过RTSP/ONVIF协议实现了优秀的视频能力。它可以采集前端接入设备的音视频资源,并将其转码成适用于全平台、全终端分发的视频流格式,包括RTMP、FLV、HLS、WebRTC等格式。这使得LntonNVR平台具备了视频监控直播、云端录像、检索与回看、告警等安防监控功能。平台部署轻快......
  • t113-c-lvgl8-gui例子
    其实tina官方提供了littellvgl的例子,既然找不到原因(可能是8.39的bug),那就看看官方怎么写的。路径主路径是在这里:makefile:显然这makefile是显示在应用层开发的main中:在littlelvgl中有个lvinit是用来初始化内存等等东西的,而在我写的程序中并没有写入写入后仍然不行,看来不是......
  • 8.7-8.13学习总结博客五:Hive进阶与复杂查询
    博客题目:学习总结五:Hive进阶与复杂查询实践内容概要:学习Hive进阶的使用方法,包括复杂查询、数据转换和性能优化等方面的知识。学习资源:推荐的Hive进阶教程、实践案例和性能优化技巧。实践内容:通过编写复杂的Hive查询语句,探索Hive的高级功能和性能优化方法,并分享实践中的挑战和解决......
  • P7438 更简单的排列计数 题解
    前置芝士:伯努利数等幂求和。其中伯努利数\(B_i\)的生成函数为\(\frac{x}{e^x-1}\)。首先这种逆序对有个套路的dp:令\(f_{i,j}\)表示填了前\(i\)个数,逆序对为\(j\),这时排列的\(val_{\pi}\)的乘积之和。有转移:\(f_{i,j}=\sum\limits_{k=0}^{i-1}f_{i-1,j-k}i^k\),初始......
  • P7092 计数题 题解
    前置题目:P5748集合划分计数。我们令\(Bell_n\)表示将\(n\)个有标号的球划分为若干集合的方案数。且\(Bell_n=n![x^n]e^{e^x-1}\)。首先,当\(k=0\)时,\(\mu(S)=0\),答案为\(0\)。当\(k=1\)时,\(\mu(S)=(-1)^{|S|},\varphi(S)=\prod\limits_{x\inS}(x-1)\)。记\(\pi(S)......
  • 「算法与数据结构」从入门到进阶吐血整理推荐书单
    一.入门系列这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。很适合在闲暇之余拿出来阅读一番。1.1《啊哈!算法》这不过是一本有趣的算法书而......
  • [ABC309G] - Ban Permutation 题解
    [ABC309G]-BanPermutation题解题目描述求长为\(N(N\leq100)\)且满足以下条件的排列\(P=(P_1,P_2,...,P_N)\)的个数,模\(998244353\):\(\forall1\leqi\leqN\),\(|P_i-i|\geqX(X\leq5)\)。思路首先拆绝对值,得到:\[P_i\geX+i\veeP_i\leX-i\]数数题除了排列......