编程题-翻棋游戏-枚举

这是一个关于编程题目的解析,涉及翻转棋盘上的瓦片以达到所有瓦片白面朝上的目标。通过分析,确定至少需要翻转的次数,并提出一种O(MN2N)复杂度的枚举算法。文章提供了样例输入和输出,以及Python代码实现,用于验证算法的正确性并找出最优解。
摘要由CSDN通过智能技术生成

题目

约翰知道,那些高智力又快乐的奶牛产奶量特别高.所以他做了一个翻瓦片的益智游戏来娱乐奶牛.在一个M×N(1≤M,N≤15)的骨架上,每一个格子里都有一个可以翻转的瓦片.瓦片的一面是黑色的,而另一面是白色的.对一个瓦片进行翻转,可以使黑变白,也可以使白变黑.然而,奶牛们的蹄子是如此的巨大而且笨拙,所以她们翻转一个瓦片的时候,与之有公共边的相邻瓦片也都被翻转了.那么,这些奶牛们最少需要多少次翻转,使所有的瓦片都变成白面向上呢?如杲可以做到,输出字典序最小的结果(将结果当成字符串处理).如果不能做到,输出“IMPOSSIBLE”.

样例

输入
M=4
N=4
每个格子的颜色如下(0表示白色,1表示黑色)
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

输出:
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0

题目分析

首先,一个格子的连续翻转2次的,颜色会恢复原状,并且一个格子的颜色变换取决于他周围和他自身,那么可以知道,
1.一个棋子要么翻或者不翻,不会存在一个棋子翻2次及其以上
2.给定一个解法,翻棋子的顺序是无关紧要的

如果我们用枚举的方法,枚举出每一行的翻法,复杂度为 O(2MN)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值