转换从C到Javascript:数独解决方案生成器
Convert from C to Javascript: Sudoku solution generator
我用C写了一个生成数独解的程序。它会随机生成数字,不断地填满谜题。如果它试图填充一个位置超过20次,它会将所有内容重置为0并重新开始。
代码在c中工作得很好,但我不能让它在JavaScript中工作。我不想做什么花哨的东西,只是把它显示在网页上。当我运行这个脚本时,它使页面崩溃(我最终得到一个'page not responding'消息)。
我非常感谢任何反馈我在哪里做错了。
C代码在JavaScript下面。
在JavaScript:function Sudoku2() {
/* constant */
var LEN = 9;
/* Track numbers in use */
var blockNums = new Array(LEN);
var rowNums = new Array(LEN);
var colNums = new Array(LEN);
/* solution by blocks (e.g. [0][0-8] is block 0) */
var solutionBlocks = new Array(LEN);
/* final puzzle solution (rows x cols) */
var solution = new Array(LEN);
/* Track where we are */
var row, col, block, num = 0, iterations = 0;
/* make arrays 2d */
for (i=0; i < LEN; i++) {
blockNums[i] = new Array(LEN);
rowNums[i] = new Array(LEN);
colNums[i] = new Array(LEN);
solutionBlocks[i] = new Array(LEN);
solution[i] = new Array(LEN);
solution[i][9] = "<br />";
}
/* Generate solution by block */
for (block = 0; block < LEN; block++) {
for (i = 0; i < LEN; ) {
/* Generate a random number */
num = Math.floor(Math.random()*LEN) + 1;
/* If iteration is > 20 for any i, the solution is unsolvable */
if (iterations > 20) {
/* Reset everything */
for (j = 0; j < LEN; j++) {
for (k = 0; k < LEN; k++) {
solution[j][k] = 0;
solutionBlocks[j][k] = 0;
blockNums[j][k] = 0;
rowNums[j][k] = 0;
colNums[j][k] = 0;
}
}
i = 0;
iterations = 0;
block = 0;
}
/* is number already assigned to block? */
if (blockNums[block][num - 1] === 0) {
/* convert block number/position to row and col */
col = ((block % 3) * 3) + (i % 3);
row = (i / 3) + ((block / 3) * 3);
/* if number not assigned to row or col */
if (rowNums[row][num - 1] === 0 && colNums[col][num - 1] === 0) {
/* assign number */
solutionBlocks[block][i] = num;
solution[row][col] = num;
blockNums[block][num - 1] = 1;
rowNums[row][num - 1] = 1;
colNums[col][num - 1] = 1;
iterations = 0;
i++;
/* otherwise, track # of loops */
} else { iterations++; }
}
}
}
/* Generate string output */
var str = solution.toString();
var screenOutput = document.getElementById("sudoku2");
screenOutput.innerHTML=str;
}
在C: #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 9
int main ()
{
/* Track numbers in use */
int blockNums[LEN][LEN] = {0};
int rowNums[LEN][LEN] = {0};
int colNums[LEN][LEN] = {0};
/* Track where we are */
int i = 0, row, col, block, num = 0, iterations = 0;
/* solution by blocks (e.g. [0][0-8] is block 0) */
int solutionBlocks[LEN][LEN] = {0};
/* final puzzle solution (rows x cols) */
int solution[LEN][LEN] = {0};
/* initialize random seed */
srand ( time(NULL) );
/* Generate solution by block */
for (block = 0; block < LEN; block++) {
for (i = 0; i < LEN; ) {
/* Generate a random number */
num = (rand() % LEN) + 1;
/* If iteration is > 20 for any i, the solution is unsolvable */
if (iterations > 20) {
int j, k;
/* Reset everything */
for (j = 0; j < LEN; j++) {
for (k = 0; k < LEN; k++) {
solution[j][k] = 0;
solutionBlocks[j][k] = 0;
blockNums[j][k] = 0;
rowNums[j][k] = 0;
colNums[j][k] = 0;
}
}
i = 0;
iterations = 0;
block = 0;
}
/* is number already assigned to block? */
switch (blockNums[block][num - 1]) {
case 0:
/* convert block number/position to row and col */
col = ((block % 3) * 3) + (i % 3);
row = (i / 3) + ((block / 3) * 3);
/* if number not assigned to row or col */
if (rowNums[row][num - 1] == 0 && colNums[col][num - 1] == 0) {
/* assign number */
solutionBlocks[block][i] = num;
solution[row][col] = num;
blockNums[block][num - 1] = 1;
rowNums[row][num - 1] = 1;
colNums[col][num - 1] = 1;
iterations = 0;
i++;
/* otherwise, track # of loops */
} else { iterations++; }
break;
}
}
}
/* Print solution */
for(row = 0; row < LEN; row++) {
printf(" ");
for(col = 0; col < LEN; col++) {
printf("%d ", solution[row][col]);
if (((col + 1) % 3 == 0) && (col != 8))
printf(" ");
}
printf("'n");
if (((row + 1) % 3 == 0) && (row != 8))
printf("'n");
}
return 0;
}
如果需要,下面是我使用的HTML:
<p id="sudoku2">Click it.</p>
<button type="button" onclick="Sudoku2()">it.</button>
这是JavaScript中不存在的计算错误。
我row = (i / 3) + ((block / 3) * 3);
我把它改成:
row = Math.floor((i / 3)) + (Math.floor(block / 3) * 3);
因为我的变量不是明确的整数,在确定行号时的除法会丢掉一些计算。我还添加了一个for循环,其中我使我的数字跟踪数组2D初始化为0。
相关文章:
- 在Python中抓取javascript渲染的文本的最快解决方案
- 在IE8和其他带有javascript的浏览器中获取正文类的标准解决方案是什么
- 是否有用于CSS浏览器支持新功能的javascript解决方案
- Javascript全局变量简单解决方案
- JavaScript/HTML 错误的解决方案
- Javascript Learnstreet Email Interpreter 替代解决方案
- 正在寻找与以下jQuery解决方案等效的javascript解决方案
- JavaScript没有'JSP页面重定向后无法工作..任何解决方案
- 在两个解决方案中引用通用的Javascript文件
- 用于回文变位的JavaScript解决方案
- windows中的Javascript巨大日期错误..解决方案
- 比许多使用JavaScript的循环迭代更有效的解决方案
- 为静态类型检查注释javascript的好解决方案是什么
- “稍后提醒我”/“快速事件”JavaScript解决方案
- Jquery/Javascript 解决方案,用于将 wiki 文本转换为 HTML,反之亦然
- 适用于 IE8 的子像素舍入 JavaScript/jQuery 解决方案,用于具有百分比宽度的表格单元格
- 解析器错误(Javascript初学者寻找解决方案)
- 在 Javascript 中模拟“IN”运算符以简化冗余逻辑 OR 的最佳解决方案是什么?
- 解决方案 用于使用 javascript 获取 IIS 服务器虚拟目录路径
- Jquery解决方案/ javascript函数分配变量