关灯游戏 Lights out (一)(极速求解)
关灯游戏(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 (一)(极速求解)相关推荐
- 关灯游戏c语言,关灯游戏 Lights out (一)(极速求解)
关灯游戏(Lights Out) 关灯游戏是Tiger Electronics在1995年发行的一款电子游戏,Parker Brothers在上世纪70年代发布过一款规则与此类似的3×3的游戏, Vu ...
- 关灯游戏 Lights out (三)(线性代数+高斯消元,搜索全部解)
关灯游戏和线性代数联系紧密,对于一个 的灯阵,用线性方程组+高斯消元法求解,时间复杂度为O(m×n)^3.相对于首行枚举算法复杂度O(2^n) ,线代算法的时间复杂度低很多.用线性代数求解关灯游戏是个 ...
- html关灯游戏,关灯小游戏 - 在线打字测试(dazi.kukuw.com)
关灯小游戏 贡献者:随风前行 类别:代码 时间:2016-09-10 19:12:55 收藏数:11 评分:0 返回上页 举报此文章 请选择举报理由: 广告/谣言/欺诈 政治敏感 色情/违法信息 垃圾 ...
- 【期望】关灯游戏(金牌导航 期望-8)
关灯游戏 金牌导航 期望-8 题目大意 有n盏灯,有些是亮的,有的是暗的,现在如果按一个位置的开关,那么是它因数的位置的灯都会改变开关情况,现在如果用k步不能直接关完,就随机按,直到可以k步关完,就用 ...
- Android:关灯游戏简单闯关
Demo地址:http://download.csdn.net/detail/yyn_12138/9673802 今天来实现一下5*5的关灯游戏, 其中内置一个不可以点击的石头来增加一下闯关难度 先来 ...
- 牛客网 2018校招真题 美团点评 关灯游戏
Description 牛客网 2018校招真题 关灯游戏 Solving Ideas 只与最右边的数字有关,如果最右边的数字为1,则Alice赢,否则Bob赢 假设最右边的数字为1 因为Alice是 ...
- 数独问题流程图_数独游戏的难度等级分析及求解算法研究
2 数独难度等级 数独游戏发展至今, 在数独爱好者的积极探索下, 求解数独的算法众多, 有 矩形顶点删减法.关键数删减法等 [7] .解答一道数独问题是一种或多种方法相互 结合, 为了使玩家能循环渐进 ...
- 1秒极速求解PDE:深度神经网络为何在破解数学难题上独具天赋?
转自:机器之心 两种基于深度神经网络的新方法,均可成功求解 PDE,并且能够以更快的速度.更简单的方式建模复杂的系统.有趣的是,和大多神经网络一样,我们猜不透它们为什么如此优秀. 研究者们致力于使用偏 ...
- html关灯游戏,关灯游戏
ViewController.h @property(strong,nonatomic)UIButton *button; @property(assign,nonatomic)int number; ...
- Java 编写de简单小游戏 -- 《Lights Off》
关灯游戏 – <Lights Off> 游戏规则: 当点击方块时,其左,右,上,下中的棋子灯的状态会变为相反的状态,题中假定1为开灯,0为关灯,棋盘大小为5*5,题中会随机生成开灯的方块, ...
最新文章
- Pass Infrastructure基础架构(上)
- 人工智能对地球环境科学的推进
- JDK 13 的 12 个新特性,真心涨姿势了
- 趋势 | 人工智能领域十大最具成长性技术展望
- 我的Go+语言初体验——【一、go+环境WIN10_100%成功安装(附-视频)】
- DNS域名解析服务(正向解析、反向解析、主从服务器)
- stm32 带通滤波器_带通滤波 - 基于STM32芯片和TFT-LCD的便携式心电图仪设计
- android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别
- Spring Cache 配置及一些问题的解决
- root用户连接mysql数据库出错 1045 access denied for user 'root'@'localhost' using password yes
- php向后兼容,PHP: 不向后兼容的变更 - Manual
- Python+matplotlib绘制动态更新的柱状图
- P102、面试题14:调整数组顺序使奇数位于偶数前面
- MapReduce on Yarn 的流程和架构图
- vs2015编译vtk
- 仿爱奇艺加载dialog
- Matlab基于动态粒子群算法的动态环境寻优算法 基本粒子群算法首先是在解空间中随机初始化所有粒子
- vue 悬浮按钮组件_Vue悬浮球效果
- DB2 9 使用拓荒(733 检验)认证指南,第 4 部分: 嵌入式 SQL 编程(3)
- linux下多人聊天室
热门文章
- 南航计算机考研专业课复习重点
- UCF101视频分类之CNN-LSTM-Code总结
- 求助微软商店下载的Ubuntu打开后显示目标路径参数错误,进入路径强制打开显示0x80070005错误。各种方法都试验了
- 如何持续突破性能表现? | DX研发模式
- pix4d操作流程_pix4d处理流程
- creo扫描选择多条链作为轨迹_Proe/Creo曲面造型·蓝牙耳机纹理曲面纹理
- OC、OD、线或线与逻辑
- CCS 8.00 软件中视窗的应用
- 【web素材】01-10款大气的购物商城网站模板
- c语言2种软件下载,C语言代码自动整理工具