• 摸鱼也摸鱼之在线数独自动求解


    背景

    在发现被老板CPU之后,大家想做的基本上都是摸鱼,像我这种没什么手法的人不可能摸鱼打MOBA游戏,所以只能选择数独这种对时间要求不怎么急促的小游戏。然而,有时候搞半天才发现从一开始就错了,这让我很苦恼,看来有必要对这一摸鱼行动进行再次摸鱼。

    平台

    偶然发现的在线数独页游[在线数独 (sudoku-cn.com)]

    方案

    浏览器安装油猴插件,并新建一个油猴脚本,其内容如下:

    1. // ==UserScript==
    2. // @name 右键自动解答数独
    3. // @namespace http://tampermonkey.net/
    4. // @version 0.1
    5. // @description try to take over the world!
    6. // @author You
    7. // @match https://sudoku-cn.com/
    8. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
    9. // @grant none
    10. // ==/UserScript==
    11. (function() {
    12. 'use strict';
    13. let board = [];
    14. let over = false;
    15. let hang=[];
    16. let lie=[];
    17. let mid=[];
    18. function getQuestion() {
    19. hang=[];
    20. lie=[];
    21. mid=[];
    22. for(let i=0;i<9;i++){
    23. hang.push([false,false,false,false,false,false,false,false,false]);
    24. lie.push([false,false,false,false,false,false,false,false,false]);
    25. mid.push([false,false,false,false,false,false,false,false,false]);
    26. }
    27. board=[];
    28. let str="";
    29. for (let i = 0; i < 9; i++) {
    30. board.push([]);
    31. for (let j = 0; j < 9; j++) {
    32. let div = document.querySelector("#vc_" + j + "_" + i);
    33. if (div.innerHTML.trim().length != 0&&div.className=="r1") {
    34. board[i].push(div.innerHTML.trim());
    35. str+=div.innerHTML.trim();
    36. hang[i][board[i][j].charCodeAt(0)-49]=true;
    37. lie[j][board[i][j].charCodeAt(0)-49]=true;
    38. mid[Math.floor(i/3)*3+Math.floor(j/3)][board[i][j].charCodeAt(0)-49]=true;
    39. } else {
    40. str+="_";
    41. board[i].push("_");
    42. }
    43. }
    44. }
    45. /* console.log("源:",str); */
    46. }
    47. function dfs(i,j) {
    48. if (over)
    49. {
    50. return;
    51. }
    52. if (i >= 9 || j >= 9)
    53. {
    54. over = true;
    55. return;
    56. }
    57. if (board[i][j] != '_')
    58. {
    59. if (j == 9 - 1)
    60. {
    61. dfs(i + 1, 0);
    62. }
    63. else
    64. {
    65. dfs(i, j + 1);
    66. }
    67. return;
    68. }
    69. for(let number = 1; number <= 9; number++)
    70. {
    71. if (hang[i][number - 1] || lie[j][ number - 1] || mid[Math.floor(i / 3) * 3 +Math.floor( j / 3)][ number - 1])
    72. {
    73. continue;
    74. }
    75. else
    76. {
    77. board[i][j] =String.fromCharCode(number + 48);
    78. hang[i][number - 1] = true;
    79. lie[j][ number - 1] = true;
    80. mid[Math.floor(i / 3) * 3 + Math.floor(j / 3)][ number - 1] = true;
    81. if (j == 9 - 1)
    82. {
    83. dfs(i + 1, 0);
    84. }
    85. else
    86. {
    87. dfs(i, j + 1);
    88. }
    89. if (over)
    90. {
    91. return;
    92. }
    93. else
    94. {
    95. board[i][j] = '_';
    96. hang[i][ number - 1] = false;
    97. lie[j][ number - 1] = false;
    98. mid[Math.floor(i / 3) * 3 +Math.floor( j / 3)][ number - 1] = false;
    99. }
    100. }
    101. }
    102. }
    103. function setAnswer() {
    104. let index = 0;
    105. for (let i = 0; i < 9; i++) {
    106. for (let j = 0; j < 9; j++) {
    107. let div = document.querySelector("#vc_" + j + "_" + i);
    108. div.innerHTML = board[i][j];
    109. }
    110. }
    111. }
    112. document.oncontextmenu = (e) => {
    113. e.preventDefault();
    114. over = false;
    115. getQuestion();
    116. dfs(0,0);
    117. setAnswer();
    118. }
    119. })();

    如代码所示,我把鼠标右键默认事件取消了,取而代之的是右键单击时自动求解该题目,并填写答案进去。

    测试

    直接高级+难度的题目

    点击鼠标右键直接求解

     

    全是绿色的,那就没问题了。

    至此,完成了摸鱼也摸鱼的目标。

  • 相关阅读:
    【数据结构】时间复杂度_空间复杂度
    【随笔】移动端input type|语义与IOS按键
    概率DP—练习
    C++流插入和流提取的重载!
    C语言练习百题之#ifdef和#ifndef的应用
    解决uni-app小程序获取路由及路由参数
    ESP32C3 LuatOS TM1650②动态显示累加整数
    使用命令进行把新代码上传到git上
    Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
    Oringin制图之Sci图参数设置
  • 原文地址:https://blog.csdn.net/qq_36694133/article/details/133030910