- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 SciLab 中编写了一个解决数独问题的程序。但它只能解决总是有一个可能值为 1 的正方形的数独。就像 brainbashers.com 上非常简单和简单的数独游戏。
中等数独总是会到达一个点,即它们没有具有 1 个可能值的正方形。我如何修改我的代码来解决这些更难的数独问题?
///////////////////////////////////////////////////////////////////////////
////////////////////////// Check Sudoku ///////////////////////////////
///////////////////////////////////////////////////////////////////////////
function r=OneToNine(V) // function checks if the given vector V contains 1 to 9
r = %T // this works
u = %F
index = 1
while r == %T & index < 10
for i=1 : length(V)
if V(i)==index then
u = %T
end
end
index=index+1
if u == %F then r = %F
else u = %F
end
end
if length(V) > 9 then r = %F
end
endfunction
function y=check(M) // Checks if the given matrix M is a solved sudoku
y = %T // this works too
if size(M,1)<>9 | size(M,2)<>9 then // if it has more or less than 9 rows and columns
y = %F // we return false
end
for i=1 : size(M,1) // if not all rows have 1-9 we return false
if OneToNine(M(i,:)) == %F then
y = %F
end
end
endfunction
function P=PossibilitiesPosition(board, x, y)
// this one works
// we fill the vector possibilites with 9 zeros
// 0 means empty, 1 means it already has a value, so we don't need to change it
possibilities = [] // a vector that stores the possible values for position(x,y)
for t=1 : 9 // sudoku has 9 values
possibilities(t)=0
end
// Check row f the value (x,y) for possibilities
// we fill the possibilities further by puttin '1' where the value is not possible
for i=1 : 9 // sudoku has 9 values
if board(x,i) > 0 then
possibilities(board(x,i))=1
end
end
// Check column of the value (x,y) for possibilities
// we fill the possibilities further by puttin '1' where the value is not possible
for j=1 : 9 // sudoku has 9 values
if board(j, y) > 0 then
possibilities(board(j, y))=1
end
end
// Check the 3x3 matrix of the value (x,y) for possibilities
// first we see which 3x3 matrix we need
k=0
m=0
if x >= 1 & x <=3 then
k=1
else if x >= 4 & x <= 6 then
k = 4
else k = 7
end
end
if y >= 1 & y <=3 then
m=1
else if y >= 4 & y <= 6 then
m = 4
else m = 7
end
end
// then we fill the possibilities further by puttin '1' where the value is not possible
for i=k : k+2
for j=m : m+2
if board(i,j) > 0 then
possibilities(board(i,j))=1
end
end
end
P = possibilities
// we want to see the real values of the possibilities. not just 1 and 0
for i=1 : 9 // sudoku has 9 values
if P(i)==0 then
P(i) = i
else P(i) = 0
end
end
endfunction
function [x,y]=firstEmptyValue(board) // Checks the first empty square of the sudoku
R=%T // and returns the position (x,y)
for i=1 : 9
for j=1 : 9
if board(i,j) == 0 & R = %T then
x=i
y=j
R=%F
end
end
end
endfunction
function A=numberOfPossibilities(V) // this checks the number of possible values for a position
A=0 // so basically it returns the number of elements different from 0 in the vector V
for i=1 : 9
if V(i)>0 then
A=A+1
end
end
endfunction
function u=getUniquePossibility(M,x,y) // this returns the first possible value for that square
pos = [] // in function fillInValue we only use it
pos = PossibilitiesPosition(M,x,y) // when we know that this square (x,y) has only one possible value
for n=1 : 9
if pos(n)>0 then
u=pos(n)
end
end
endfunction
///////////////////////////////////////////////////////////////////////////
////////////////////////// Solve Sudoku ///////////////////////////////
///////////////////////////////////////////////////////////////////////////
function G=fillInValue(M) // fills in a square that has only 1 possibile value
x=0
y=0
pos = []
for i=1 : 9
for j=1 : 9
if M(i,j)==0 then
if numberOfPossibilities(PossibilitiesPosition(M,i,j)) == 1 then
x=i
y=j
break
end
end
end
if x>0 then
break
end
end
M(x,y)=getUniquePossibility(M,x,y)
G=M
endfunction
function H=solve(M) // repeats the fillInValue until it is a fully solved sudoku
P=[]
P=M
if check(M)=%F then
P=fillInValue(M)
H=solve(P)
else
H=M
end
endfunction
//////////////////////////////////////////////////////////////////////////////
所以它解决了第一个
// Very easy and easy sudokus from brainbashers.com get solved completely
// Very Easy sudoku from brainbashers.com
M = [0 2 0 0 0 0 0 4 0
7 0 4 0 0 0 8 0 2
0 5 8 4 0 7 1 3 0
0 0 1 2 8 4 9 0 0
0 0 0 7 0 5 0 0 0
0 0 7 9 3 6 5 0 0
0 8 9 5 0 2 4 6 0
4 0 2 0 0 0 3 0 9
0 1 0 0 0 0 0 8 0]
但它并没有解决这个媒介:
M2= [0 0 6 8 7 1 2 0 0
0 0 0 0 0 0 0 0 0
5 0 1 3 0 9 7 0 8
1 0 7 0 0 0 6 0 9
2 0 0 0 0 0 0 0 7
9 0 3 0 0 0 8 0 1
3 0 5 9 0 7 4 0 2
0 0 0 0 0 0 0 0 0
0 0 2 4 3 5 1 0 0]
尝试解决中等数独时的错误代码:
-->solve(M2)
!--error 21
Invalid index.
at line 14 of function PossibilitiesPosition called by :
at line 3 of function getUniquePossibility called by :
at line 20 of function fillInValue called by :
at line 182 of function solve called by :
at line 183 of function solve called by :
at line 183 of function solve called by :
at line 183 of function solve called by :
at line 183 of function solve called by :
solve(M2)
at line 208 of exec file called by :
_SCILAB-6548660277741359031.sce', 1
while executing a callback
最佳答案
好吧,编写数独求解器的最简单方法之一(不是最有效的)可能是使用所有可能的选项递归地求解每个单元格(这可能类似于“回溯”算法),直到得到完整答案找到了。
另一种选择(我会说它更好)是遍历所有方 block 解决所有“简单”方 block 并将可能的答案存储在其他方 block 中,然后重复(现在你已经解决了更多),重复这个过程直到解出数独或不能直接解出更多的方 block 。然后你可以尝试剩下的用暴力或回溯(也许数独已经解出一半或更多,所以它可能相对有效)
无论如何,通过快速搜索我找到了this Wikipedia page其中一些数独求解算法用伪代码示例进行了解释,希望这些对您有用
关于algorithm - 数独求解器 - Scilab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288165/
在 Scilab 中创建一个包含换行符的简单字符串。 看起来很简单,但 Scilab 似乎只能通过 printf 样式函数和 msprintf/sprintf 将字符串拆分为换行符处的字符串向量! 我
我正在处理一个相当大的数据集,每当我执行操作时,如果我忘记在语句末尾包含分号,则需要几分钟时间,因为它会在执行过程中将所有数据输出到控制台窗口。如何停止当前语句的执行? 我已经尝试过像在 MATLAB
我需要使用 scilab 找到精度为 0.00001 的方程的最小绝对根。方程本身:x - cos (1.04 * x) = 0。需要建立一个图形来确定函数改变符号的时间间隔。然后计算一阶和二阶导数。
我编写了一个代码,通过插值点来计算分差法和拉格朗日法的结果。我还想使用符号变量构建多项式,但我该如何实现? function dividedDifferences(X,Y,x) ddMatri
SciLab 中美元符号 ($) 的含义是什么? 编辑:我的意思是索引列表中使用的美元符号。我以为那是它的单一用途。 最佳答案 美元符号可用于指代任何向量或矩阵的最后一个元素。 -->A = [1 2
我试图在两点之间绘制一条线:a(xa,ya) 和 b(xb,yb)。我怎样才能在 Scilab 中做到这一点? 预先感谢您的帮助 最佳答案 我发现用 plot 命令来做这个很方便。将顶点组装成 [x0
我正在尝试使用以下步骤评估 Scilab 中的函数: x=poly(0,'x') y=(x^18+x^11)^3 // function (the function is variable) y1=d
我正在开发 Qt 应用程序,它必须使用 Scilab 的数值引擎计算一些数据。我的操作系统是 Ubuntu 14.04,安装了 Scilab v.5.5.0 和 QtCreator v.3.2.1 (
p(1)= 0. p(2)= 0.6771057 p(3)= 0.8277359 p(4)= 1.3828832 p(5)= 1.7971431 p(6)= 2.1882188 p(7)= 2.691
在 Scilab 中的绘图中是否可以有不同的颜色?我使用 mtlb_hold保持图形并且它工作正常,但我的问题是我的图形中有相同的颜色。在 Matlab 中使用 hold命令,我有不同的颜色。在 Sc
我在理解函数 loadwave(...) 的确切工作原理方面遇到了一些问题。所以我在这里找到了一个带有描述的文件:/usr/share/scilab/modules/sound/macros/load
您将如何在 SciLab 或 MatLab 中绘制这些图?我对这些不熟悉,不知道该软件是如何工作的。请帮忙。 $Plot following functions with different colo
我是计算机专业的一年级学生,无法让我的函数正常工作。我收到未公开的错误并且不知道为什么。 我已经让它工作了,但它没有在末尾显示列表或允许我使用 %T 和 %F 作为我的“转义” bool 变量。 有什
我在 SciLab 中编写了一个解决数独问题的程序。但它只能解决总是有一个可能值为 1 的正方形的数独。就像 brainbashers.com 上非常简单和简单的数独游戏。 中等数独总是会到达一个点,
我正在尝试编写一个使用回溯解决数独问题的程序。我现在正在使用 scilab。我的递归算法不断出错,我一定是做错了什么。欢迎任何帮助。 我把我的错误代码放在底部。 ///////////////////
我是 Scilab 的新用户,我不是数学家。 作为我的最终目标,我想计算(并绘制)分段定义函数的导数,请参阅 here . 我尝试从小处着手,只使用一个简单的(连续的)函数:f(x) = 3*x。 我
我在 OSX 10.7.4 上使用 Scinote 5.4.0。我无法使用 exec("path") 从控制台执行脚本文件命令;当我这样做时,只读取脚本文件的第一行。 例子: -->exec("plo
我正在尝试使用 Scilab 求解这个微分方程组: 它描述了弹珠在平面上滑动的运动。我希望我的 Scilab 程序能够绘制弹珠的轨迹,即 X 轴上的 rcos(theta) 和 Y 轴上的 rsin(
我想在 scilab 中绘制 limacon,我有这个方程需要处理: 我知道r>0和l>0 当我编译以下代码时,我在第 5 行收到此错误: Inconsistent row/column dimens
我必须在 scilab 中的有向无环图上实现图算法。 如何在输出窗口中显示输出图形?我需要创建 GUI 吗? 最佳答案 有一个名为 Metanet 的模块/工具箱,请参阅 http://atoms.s
我是一名优秀的程序员,十分优秀!