关灯游戏(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/*关灯游戏求解代码(只求解初始状态全亮灯阵)*/

#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

...

对上面程序点评:

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

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

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

  1. c语言函数游戏,C语言做游戏常用到一些函数大全 2011.doc

    蕾讳键哼蚂屋号煞同臭眼垣渊含短徽讽介毋蛾胀凉穗幸蒲蚂谁筷瞬懈汰摸某绿斌茫纸致忿拉烘七拔鹰勒匙怎搽炙拖铰冕鄙衙筏趣梧作骑芝计蓖婿揣拱夸曾霄后韶恃夷证卸冤腑免而肌蝇艰耽属搭舀题概快培盆臭懂崭苟误雀淄霍狂抬 ...

  2. c语言课时设计猜坐标游戏,c语言小游戏课程设计报告.docx

    c语言小游戏课程设计报告 中国地质大学 本科生课程论文封面 课程名称c语言课程设计 教师姓名陈喆老师 本科生姓名周宜诺 本科生学号XX 本科生专业土地资源管理 所在院系公共管理学院 类别: 日期: 课 ...

  3. hangman游戏c语言,英语游戏 猜词游戏hangman

    HANGMAN英语课堂游戏的设计 广东深圳市电子技术学校 张江宏 一.Hangman游戏的由来 Hangman在西方是一个家喻户晓的猜词游戏.Hang的英文意思是"绞死",而Man ...

  4. 纸牌游戏c语言 翻牌游戏,纸牌游戏.doc

    纸牌游戏 纸牌游戏 摘要 纸牌游戏是大家熟知的益智游戏.早期纸牌大部分为数码牌,中国的玩法通常是高点数胜低点数,或以特殊组合牌型取胜,此二原则仍为两大牌戏派别中论计胜负的标准.今天,桥牌已成为高雅的社 ...

  5. c语言小游戏(c语言小游戏代码飞机大战)

    怎样用C语言编写一个小游戏? "贪吃蛇"C代码: #include #include #include #include #include #define W 78  //游戏框的 ...

  6. c语言自带函数游戏,c语言消除游戏(带排行榜)

    #include #include #include #include typedef struct position { int x; int y; } posType; typedef struc ...

  7. 开火车游戏c语言,幼儿园游戏教案《开火车》三篇

    [导语]教案是教师为顺利而有效地开展教学活动,根据课程标准,教学大纲和教科书要求及学生的实际情况,以课时或课题为单位,对教学内容.教学步骤.教学方法等进行的具体设计和安排的一种实用性教学文书.无忧考网 ...

  8. 开火车游戏c语言,大班游戏活动:开火车

    大班游戏活动:开火车 活动目标: 1.锻炼幼儿身体的协调能力和动作的灵敏性: 2.培养幼儿的合作意识和合作能力. 活动准备: 平整的场地.<健康歌>音乐.呼啦圈若干 活动过程: 一.活动环 ...

  9. 如何用c需要写游戏脚本语言,写游戏脚本最好的语言用运行比较好

    有的窗口的标题是比较容易得到的,所以应使用标题进行搜索" '日期相关: 1. 取出日期时间 1)DateValue(x),TimeValue(x) 格式:v=DateValue(x) :取出 ...

最新文章

  1. 【设计模式】外观模式
  2. 鼠标控制视角wasd移动_无线款,轻量级,稳控制:雷蛇(Razer) 毒蝰终极版鼠标的快速体验...
  3. Redis的session管理和Memcached的session管理不同
  4. mysql登录不了了_登录不了MySQL的解决方法
  5. 位图像素的颜色 携程编程大赛hdu
  6. qt中QHostAddress与QString相互转换
  7. opencv入门_【OpenCV入门之十八】通过形态学操作提取水平与垂直线
  8. 华为鸿蒙系统手机央视,央视再次确认!华为投入巨资打造鸿蒙系统生态:体验媲美七成安卓...
  9. CSUOJ 1170 A sample problem
  10. java非静态方法调用静态方法_java - 无法对非静态方法进行静态引用
  11. 我写了一个桌面搜索引擎
  12. 微信小程序插件wxParse的使用
  13. 1.1 爬虫入门介绍
  14. npm --save和--save-dev区别
  15. 最新Symantec企业版官方专用卸载工具
  16. 密码学实验-RSA算法的几种攻击方法的实现
  17. 11-Linux中批量解压缩rar文件
  18. GE OPC Server 源代码
  19. 销售出库单单价为零的故障解决
  20. 安利推荐logo设计神器

热门文章

  1. Python实现天气查询源码
  2. 转:性、金钱、幸福与死亡,孰轻孰重?
  3. metricbeat mysql_Metricbeat 参考指南(目录)
  4. 浅谈ffmpeg 压缩视频
  5. 机器学习之恶意流量检测的特征工程
  6. Ubuntu18.04 工控机接USB无线网卡无法连网问题解决办法
  7. 计算机未能找到网络,无线适配器未找到,未找到网络适配器
  8. 判断点在向量上的方向
  9. c语言设整型变量xyz为5,C语言程序设计教程清华大学出版社陈明主编第5章答案.doc...
  10. 跨境电商API接口,Lazada商品详情,按关键词搜索,商品评论等数据的采集获取