博客
关于我
AcWing 95. 费解的开关 二进制全排列+思维
阅读量:578 次
发布时间:2019-03-09

本文共 2209 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要判断在6步以内是否可以使5x5的灯阵中的所有灯都亮起。每个灯的状态可以通过翻动其开关来改变,并且翻动一个灯会导致其相邻的灯也跟着改变状态。

方法思路

我们可以通过枚举所有可能的初始状态来解决这个问题。具体来说,我们将第一行的灯状态固定下来,共有32种可能的组合。对于每一种组合,我们会模拟翻动灯的过程,计算所需的步骤数,并检查是否在6步以内完成任务。

具体步骤如下:

  • 读取输入,包括n个测试用例。
  • 对于每个测试用例,枚举所有可能的第一行状态(32种)。
  • 对于每种状态,复制初始状态到当前状态数组。
  • 模拟翻动灯的过程,计算所需的步骤数。
  • 检查是否在6步以内完成任务,并记录最小的步骤数。
  • 如果所有情况都遍历过了,找到最小的步骤数,否则返回-1。
  • 解决代码

    import sysdef main():    input = sys.stdin.read().split()    idx = 0    n = int(input[idx])    idx += 1    for _ in range(n):        rows = []        while len(rows) < 5:            rows.append(input[idx])            idx += 1        grid = [list(row) for row in rows]        found = -1        for mask in range(32):            current = [list(row) for row in grid]            cnt = 0            for j in range(5):                if (mask >> j) & 1:                    x, y = 0, j                    for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]:                        if 0 <= x+dx <5 and 0 <= y+dy <5:                            current[x+dx][y+dy] = '1' if current[x+dx][y+dy] == '0' else '0'                    cnt += 1            for i in range(4):                for j in range(5):                    if current[i][j] == '0':                        x, y = i+1, j                        for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]:                            if 0 <= x+dx <5 and 0 <= y+dy <5:                                current[x+dx][y+dy] = '1' if current[x+dx][y+dy] == '0' else '0'                        cnt += 1                        if cnt >= 6:                            break                if cnt >=6:                    break            all_on = True            for j in range(5):                if current[4][j] != '1':                    all_on = False                    break            if all_on and cnt <=6:                if found == -1 or cnt < found:                    found = cnt            if found <=6:                break        print(found if found != -1 else -1)if __name__ == '__main__':    main()

    代码解释

  • 读取输入:从标准输入读取数据,包括n个测试用例。
  • 枚举第一行状态:对于每个测试用例,枚举所有可能的第一行状态(0到31)。
  • 模拟翻动过程:对于每种第一行状态,复制初始状态到当前状态数组,然后模拟翻动灯的过程,计算所需的步骤数。
  • 检查是否完成任务:检查当前状态是否所有灯都亮起,并且步骤数是否在6步以内。如果是,记录最小的步骤数。
  • 输出结果:对于每个测试用例,输出最少需要的步骤数,或者-1表示无法在6步内完成任务。
  • 通过这种方法,我们可以高效地解决问题,并找到最优解。

    转载地址:http://phkpz.baihongyu.com/

    你可能感兴趣的文章
    Qt开发——网络编程之UDP客户端
    查看>>
    postgis数据库优化_postgresql 性能优化
    查看>>
    postgis求面积、交集等相关函数
    查看>>
    postgis相关函数
    查看>>
    Postgres Docker版本安装mysql_fdw 插件
    查看>>
    Postgres invalid command \N数据恢复处理
    查看>>
    Postgres like 模糊查询匹配集合
    查看>>
    Postgres 自定义函数内实现 in 操作符的递归查询
    查看>>
    Postgres 返回当前时间前后指定天数的集合
    查看>>
    postgres--vacuum
    查看>>
    postgres--wal
    查看>>
    postgres--流复制
    查看>>
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview sharding增强 - pushdown 增强
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>
    PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
    查看>>
    Qt开发——网络编程UDP网络广播软件之服务器端
    查看>>
    Postgresql 12.9如何配置允许远程连接
    查看>>