最近在学习mooc上北大的算法课程,其中有一个熄灯问题的算法,感觉特别精妙,不过本人愚钝,看了3天多,才完全明白其中含义。因为该视频教程是使用C++编写的。本人java程序员一枚,就将程序改造层java版本的了,并且加上了一些调试信息,辅助理解。感觉程序要敲出来,并且debug一下,才能真正明白。为了史大家少走弯路,我本人将源码贡献出来,供大家参考。


import java.util.Scanner;public class S4 {static int light[][] = new int[4][5];   //灯亮情况数组5行6列去外围(左右头尾);static int press[][] = new int[4][5];   //灯亮情况数组5行6列去外围(左右头尾);public static void main(String[] args) {System.out.println("请输入灯亮情况");Scanner input = new Scanner(System.in);//获取输入数组:灯亮情况for (int i = 1; i < light.length; i++) { //行for (int j = 1; j < light[i].length - 1; j++) { //列light[i][j] = input.nextInt();}}System.out.println("输入完毕");if (firstRow()) {for (int i = 1; i < press.length; i++) { //行for (int j = 1; j < press[i].length - 1; j++) { //列System.out.print(press[i][j] + " ");}System.out.println(); //换行}} else {System.out.println("找不到解法");}}private static boolean firstRow() {//二进制转换器for (int i = 0; i < light.length; i++) { //行for (int j = 0; j < light[i].length; j++) { //列press[i][j] = 0; //初始化所有按钮为0,包括外围}}while (!guess(press)) {press[1][1]++;int c = 1;//指向的数while (press[1][c] > 1) {press[1][c] = 0;//进位变0c++;press[1][c]++;if (press[1][press[1].length - 2] > 1) {return false;}}}return true;}private static boolean guess(int[][] press) {for (int i = 2; i < press.length; i++) {//行System.out.println(press[i].length-1);for (int j = 1; j < press[i].length-1; j++) {System.out.println("light["+(i-1)+"]["+j+"]:"+light[i - 1][j]);System.out.println("press["+(i-1)+"]["+j+"]:"+press[i - 1][j]);System.out.println("press["+(i-1)+"]["+(j-1)+"]:"+press[i - 1][j-1]);System.out.println("press["+(i-2)+"]["+(j)+"]:"+press[i - 2][j]);System.out.println("press["+(i-1)+"]["+(j+1)+"]:"+press[i - 1][j + 1]);System.out.println("总共press["+i+"]["+j+"]:"+((light[i-1][j] + press[i-1][j] + press[i - 1][j - 1] + press[i - 2][j]+press[i-1][j+1]) % 2));press[i][j] = (light[i-1][j] + press[i-1][j] + press[i - 1][j - 1] + press[i - 2][j]+press[i-1][j+1]) % 2;}}System.out.println(press[press.length-1].length);int length =press.length - 1;for (int i = 1; i <= press[press.length-1].length-2; i++) {System.out.println("press["+length+"]["+i+"]"+press[length][i]);System.out.println("light["+length+"]["+i+"]"+light[length][i]);System.out.println("press["+length+"]["+(i-1)+"]"+press[length][i-1]);System.out.println("press["+length+"]["+(i+1)+"]"+press[length][i+1]);System.out.println("press["+(length-1)+"]["+i+"]"+press[length-1][i]);if (press[length][i]!=(light[length][i]+press[length][i-1]+press[length][i+1]+press[length-1][i])%2){return false;}}return true;}}

输入
1 1 1
1 1 1
1 1 1
得到
1 0 1
0 1 0
1 0 1

Java版 熄灯问题 debug调试版本相关推荐

  1. Java本地远程服务器debug调试详解

    日常我们debug是经常用的,但是本地还好说,远程debug就有点难度,而且有时候必须要在预演,测试环境的服务器去debug,举个例子,需要https,公网,域名之类的,测试服务器这些有些是配置的,但 ...

  2. 使用Eclipse开发Java Web过程中Debug调试的使用方法

    这里介绍的是在Eclipse中的Debug调试. 首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式. 运行web项目,进 ...

  3. 【java笔记】IDEA debug调试

    Debug调试: 可以让代码逐行执行,查看代码执行的过程,条市场程序中出现的bug 使用方式: Fn+F8:逐行执行程序 Fn+F7:进入到方法中 Fn+shift+F8:跳出方法 Fn+F9:跳到下 ...

  4. idea 调试java技巧_Intellij IDEA Debug 调试技巧

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 F9:恢复程序 Alt+F10:显示执行断点 F8: 跳到下一步 F7:进入到代码 Alt+shift+F7:强制进入代码 ...

  5. java方法和 IDEA Debug调试

    方法的概述: 方法就是将具有独立功能的代码块,组织成为一个整体,使其具有特殊功能的代码集.我感觉方法就是类里面的函数 注意: 方法必须先创建才可以使用,该过程称为方法的定义. 方法创建后并不是直接运行 ...

  6. java中的远程debug调试

    为什么80%的码农都做不了架构师?>>>    jvm 参数加入:-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=87 ...

  7. minecraft java版多少钱_Java版版本记录

    此页面并非官方版本记录或更新日志.官方日志请见Minecraft官网. 关于1.11及此前版本,请见Mojang官网. 关于Beta 1.8及此前版本,请见Notch的博客,Word of Notch ...

  8. 我的世界java版是免费,我的世界Java版

    我的世界Java版是一款具有超高人气的沙盒游戏,在我的世界Java版中玩家可以自由的进行创建,你就是这个游戏内的创造者,上帝的视角搭配像素的游戏会为你带来超高的体验,感兴趣的小伙伴们快来下载我的世界J ...

  9. 在Java版中被移除的物品,盘点Minecraft曾“移除”的5个物品,Mojang反悔?1.14即将加入!...

    讲台是<我的世界>非常老的一个开发计划,2012年Dinnerbone就表示,非常喜欢讲台这个设计,玩家可以在讲台上阅读和书写.2013年Dinnerbone打算重启讲台计划,但却没有成功 ...

最新文章

  1. 企业该如何实现数字化转型?
  2. 传输预编码matlab,基于MATLAB的MIMO系统预编码性能仿真教程.doc
  3. Hibernate commit() 和flush() 的区别
  4. 读空气java_空气质量指数查询示例代码
  5. 盘点程序员必备的专业术语,值得看一看
  6. 棋牌游戏服务器架构: 详细设计(三) 数据库设计
  7. django 403 错误:CSRF token missing or incorrect
  8. linux-vim-可视行模式
  9. Python 程序报错崩溃后,如何倒回到崩溃的位置?
  10. 开启mongodb数据库命令行_【赵强老师】使用MongoDB的命令行工具:mongoshell
  11. linux iso作为安装源,linux下使用iso文件做为yum安装源
  12. C#通过对象属性名修改值
  13. Delphi中的字符串压缩与解压缩
  14. 军用装备温湿度循环测试,温湿度环境可靠性实验室GJB150A
  15. Arcgis拓扑检查必须相互覆盖操作步骤
  16. C++命名空间中类声明、成员函数声明和函数模板
  17. PCL-点云处理(一)
  18. 新的用户故事待办列表就是一副地图
  19. 十、C#接口、抽象、密封、开放封闭原则
  20. 咸鱼APP产品使用报告体验分析

热门文章

  1. 浅谈主键索引与唯一索引
  2. 嫁给玩股票男人的九大理由
  3. python爬取使用线程池出现报错:exception calling callback for #x3c;Future at 0x1e8e963ef70 state=finished raised
  4. 【愚公系列】2023年04月 攻防世界-MOBILE(Android2.0)
  5. 尚硅谷前端-京东左侧导航栏及网易新闻列表练习——CSS
  6. Java中fifo什么意思_Java中的FIFO类
  7. (二)Spring自动装配
  8. linux yum 安装的路径在哪,yum 下载软件的存放位置
  9. windows版 redis安装教程,以及redis客户端安装
  10. 【AlgorithmStar机器学习】AS机器学习库特征工程使用说明文档