关灯游戏(Lights Out)

关灯游戏是Tiger Electronics在1995年发行的一款电子游戏,Parker Brothers在上世纪70年代发布过一款规则与此类似的3×3的游戏, Vulcan Electronics在1983年也生产过与此类似的游戏,名称为XL-25。

目前这款游戏的中文名很混乱,网上可见“开关灯游戏”、“灭灯游戏”、“开灯游戏”、“熄灯游戏”、“点灯游戏”、“灯阵游戏”、“地板游戏”...虽然意思都差不多,但名称不统一,不利于学术研究和搜索。在维基百科里(https://en.wikipedia.org/wiki/Lights_Out_(game)),这款游戏的英文名称为:“Lights Out”,可翻译为“关灯游戏”。
      关灯游戏规则非常简单,在一个M×N阵列里,有若干盏灯亮着(可以全部都亮着),点击任意一盏灯(不管此灯是亮着还是灭着,都可以点),那么该灯以及与该灯相邻的上、下、左、右共五盏灯都同时会变成与自身相反状态,即亮的变灭,灭的变亮(由于边角的特殊性,点击边上的灯,只有四盏灯一起变化;点击角上的灯,只有三盏灯一起变化)。

游戏的目标是:通过点击灯阵一些灯,使得灯阵上所有灯都熄灭。

来看维基的一张游戏示意图:

上图是一个5×5正方形灯阵,初始状态只有左上角一盏灯亮着;第一次点击右下角灯,则右下角三盏灯全部变亮;第二次点击右下角斜边第二个盏灯,结果如最后一个图所示(此时局面还有灯亮着,游戏并未结束)。

关灯游戏规则虽然简单,但玩起来颇有难度。于是众多程序猿想到用计算机求解。常规解法是线性代数解法,这个有点数学含量。

线性代数解法的优点很多,不单可以求解M×N任意阵列灯阵,而且对灯阵任意初始状态也能求解,是个不错的方法。不过,线性代数解法的缺点也是明显的,代码比较复杂,时间复杂度也降不下来,当灯数量很多时,就很难在有限时间内求解了。
      线性代数解法原理,网上已经有了,在这里就不介绍了。这里介绍笔者找到了一个速度超快的算法,求解511×511灯阵(初始状态全亮)耗时不到1秒,速度极快!算法很简单,就是只点击局面未亮的灯,一直找到解法为止。但笔者这个解法缺点也很明显,就是无法求解任意阵列关卡。

代码如下(C/C++):

#include<stdio.h>  /*关灯游戏求解代码(只求解初始状态全亮灯阵)*/
#define M 15       /*M等于灯阵行数*/
#define N 31       /*N等于灯阵列数*/
int main(void)
{/*M、N值须符合1, 2, 3, 5, 7, 11, 15, 23, 31, 47, 63, 95, 127, 191, 255, 383, 511...数列规律*/int a[M+2][N+2]={0},b[M+2][N+2]={0},i,j,k=1;while (k){for(i=0;++i<=M;)for(j=0;++j<=N;)if(!a[i][j])b[i][j]^=1,a[i][j]^=1,a[i][j+1]^=1,a[i][j-1]^=1,a[i+1][j]^=1,a[i-1][j]^=1;for(i=k=0;++i<=M;)for(j=0;++j<=N;)if(!a[i][j])k=1;}for(i=0;++i<=M;printf("\n"))for(j=0;++j<=N;)printf("%2d",b[i][j]);return 0;
}

例如调整M=N=11,程序输出为:

笔者这个解法只求解初始状态全都亮的灯阵,可以求解的正方形灯阵阶数为:

1, 2, 3, 5, 7, 11, 15, 23, 31, 47, 63, 95, 127, 191, 255, 383, 511, 767, 1023, 1535, 2047, 3071, 4095, 6143, 8191, 12287...
      这个数列的通项公式为:a(2n) = 2*2^n - 1,a(2n+1) = 3*2^n - 1
      符合这个数列阶数的正方形灯阵,都可以求解,另外,4阶也可以求解。

在“整数数列线上大全”(https://oeis.org/)网站上,这个数列编号为:A052955
      具体网址:

https://oeis.org/search?q=7%2C11%2C15%2C23%2C31%2C47%2C63%2C95%2C127%2C191%2C255%2C383%2C511+&sort=number&language=&go=Search
      上面程序还可以求解一些矩形灯阵,对矩形的边有如下要求:
      1、当M等于1时,N值等于上面数列任意一个数值的矩阵均可求解;
      2、当M和N的关系为下面规律数值时,M×N矩阵均可求解:

M值 1 3 7 15 31 63 127 255 ...
N值 3 7 15 31 63 127 255 511 ...

对上面程序点评:

优点:程序简单,速度极快

缺点:只能求解特殊规格矩阵,作用有限。

关灯游戏 Lights out (一)(极速求解)相关推荐

  1. 关灯游戏c语言,关灯游戏 Lights out (一)(极速求解)

    关灯游戏(Lights Out) 关灯游戏是Tiger Electronics在1995年发行的一款电子游戏,Parker Brothers在上世纪70年代发布过一款规则与此类似的3×3的游戏, Vu ...

  2. 关灯游戏 Lights out (三)(线性代数+高斯消元,搜索全部解)

    关灯游戏和线性代数联系紧密,对于一个 的灯阵,用线性方程组+高斯消元法求解,时间复杂度为O(m×n)^3.相对于首行枚举算法复杂度O(2^n) ,线代算法的时间复杂度低很多.用线性代数求解关灯游戏是个 ...

  3. html关灯游戏,关灯小游戏 - 在线打字测试(dazi.kukuw.com)

    关灯小游戏 贡献者:随风前行 类别:代码 时间:2016-09-10 19:12:55 收藏数:11 评分:0 返回上页 举报此文章 请选择举报理由: 广告/谣言/欺诈 政治敏感 色情/违法信息 垃圾 ...

  4. 【期望】关灯游戏(金牌导航 期望-8)

    关灯游戏 金牌导航 期望-8 题目大意 有n盏灯,有些是亮的,有的是暗的,现在如果按一个位置的开关,那么是它因数的位置的灯都会改变开关情况,现在如果用k步不能直接关完,就随机按,直到可以k步关完,就用 ...

  5. Android:关灯游戏简单闯关

    Demo地址:http://download.csdn.net/detail/yyn_12138/9673802 今天来实现一下5*5的关灯游戏, 其中内置一个不可以点击的石头来增加一下闯关难度 先来 ...

  6. 牛客网 2018校招真题 美团点评 关灯游戏

    Description 牛客网 2018校招真题 关灯游戏 Solving Ideas 只与最右边的数字有关,如果最右边的数字为1,则Alice赢,否则Bob赢 假设最右边的数字为1 因为Alice是 ...

  7. 数独问题流程图_数独游戏的难度等级分析及求解算法研究

    2 数独难度等级 数独游戏发展至今, 在数独爱好者的积极探索下, 求解数独的算法众多, 有 矩形顶点删减法.关键数删减法等 [7] .解答一道数独问题是一种或多种方法相互 结合, 为了使玩家能循环渐进 ...

  8. 1秒极速求解PDE:深度神经网络为何在破解数学难题上独具天赋?

    转自:机器之心 两种基于深度神经网络的新方法,均可成功求解 PDE,并且能够以更快的速度.更简单的方式建模复杂的系统.有趣的是,和大多神经网络一样,我们猜不透它们为什么如此优秀. 研究者们致力于使用偏 ...

  9. html关灯游戏,关灯游戏

    ViewController.h @property(strong,nonatomic)UIButton *button; @property(assign,nonatomic)int number; ...

  10. Java 编写de简单小游戏 -- 《Lights Off》

    关灯游戏 – <Lights Off> 游戏规则: 当点击方块时,其左,右,上,下中的棋子灯的状态会变为相反的状态,题中假定1为开灯,0为关灯,棋盘大小为5*5,题中会随机生成开灯的方块, ...

最新文章

  1. Pass Infrastructure基础架构(上)
  2. 人工智能对地球环境科学的推进
  3. JDK 13 的 12 个新特性,真心涨姿势了
  4. 趋势 | 人工智能领域十大最具成长性技术展望
  5. 我的Go+语言初体验——【一、go+环境WIN10_100%成功安装(附-视频)】
  6. DNS域名解析服务(正向解析、反向解析、主从服务器)
  7. stm32 带通滤波器_带通滤波 - 基于STM32芯片和TFT-LCD的便携式心电图仪设计
  8. android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别
  9. Spring Cache 配置及一些问题的解决
  10. root用户连接mysql数据库出错 1045 access denied for user 'root'@'localhost' using password yes
  11. php向后兼容,PHP: 不向后兼容的变更 - Manual
  12. Python+matplotlib绘制动态更新的柱状图
  13. P102、面试题14:调整数组顺序使奇数位于偶数前面
  14. MapReduce on Yarn 的流程和架构图
  15. vs2015编译vtk
  16. 仿爱奇艺加载dialog
  17. Matlab基于动态粒子群算法的动态环境寻优算法 基本粒子群算法首先是在解空间中随机初始化所有粒子
  18. vue 悬浮按钮组件_Vue悬浮球效果
  19. DB2 9 使用拓荒(733 检验)认证指南,第 4 部分: 嵌入式 SQL 编程(3)
  20. linux下多人聊天室

热门文章

  1. 南航计算机考研专业课复习重点
  2. UCF101视频分类之CNN-LSTM-Code总结
  3. 求助微软商店下载的Ubuntu打开后显示目标路径参数错误,进入路径强制打开显示0x80070005错误。各种方法都试验了
  4. 如何持续突破性能表现? | DX研发模式
  5. pix4d操作流程_pix4d处理流程
  6. creo扫描选择多条链作为轨迹_Proe/Creo曲面造型·蓝牙耳机纹理曲面纹理
  7. OC、OD、线或线与逻辑
  8. CCS 8.00 软件中视窗的应用
  9. 【web素材】01-10款大气的购物商城网站模板
  10. c语言2种软件下载,C语言代码自动整理工具