#数独程序说明V1.1-by(jiangli) R
#输入9*9 数独题目,解出所有可能
###目前计算机解数独主要靠遍历
###能否用神经网络解决数独问题?有明确的起点与终点
###部分题目训练后能主动推导出结果
###建立目标改进函数,越接近结果函数值越小。。。。。
#已改进--使用函数
#拟改进--算法优化、效率优化、网上运行(在scriptsmax.com上部署)
#函数 f_sd
f_sd <- function(sd){
shudu = sd
#1.1 对数组进行矩阵化
dim_shudu = matrix(shudu,nrow=9)
mark_num = 0
mark_i = c()
mark_j = c()
#2 标注需填写的数组
for (i in 1:9)
for(j in 1:9)
if(dim_shudu[i,j] == 0){
mark_num = mark_num + 1
mark_i[mark_num] = i
mark_j[mark_num] = j
}
sign = F
begin = 1
times = 0
#3 数独处理程序
#打印原数组
print("题目")
print(t(dim_shudu))
while(sign == F){
#统计第一个处理的次数times次数>9出错。
if(begin ==1) times=times+1
#将当前填写的格数值加上1
num = dim_shudu[mark_i[begin],mark_j[begin]] + 1
if(num > 9 ){
#当填写数字大于9的时候,回退到上一填空格
#并清空当前填写的格
dim_shudu[mark_i[begin],mark_j[begin]] = 0
begin = begin -1
}else{
dim_shudu[mark_i[begin],mark_j[begin]] = num
#同行的数不出现重复
if(length(which(dim_shudu[mark_i[begin],]==num))>1){
next
}
#同列的数不出现重复
if(length(which(dim_shudu[,mark_j[begin]]==num))>1){
next
}
#同块的数不出现重复
{
#判断是处于哪一块
li = (mark_i[begin]-1)%/%3 *3 +1
lj = (mark_j[begin]-1)%/%3 *3 +1
x = dim_shudu[c(li,li+1,li+2),c(lj,lj+1,lj+2)]
if(length(which(x[,]==num)) > 1){
next
}
}
#判断是否执行到最后一个空格 begin == length(mark_i)
#打印结果
if(begin == length(mark_i)){
print("数独答案")
print(t(dim_shudu))
}else{
#进行下一个空格处理
begin = begin + 1
}
}
#处理完成退出程序
if(begin > length(mark_i)){
sign = T
}
#异常退出数据
if(times >9){
print("输入的数据错误")
sign = T
}
}
}
###--------------------分割线--------
###--------------------输入条件,运行函数f_sd()-------
#1.输入数独数组
shudu = c(5,0,0,0,9,0,2,0,1,
0,0,2,0,0,7,0,0,8,
0,8,0,0,0,0,3,0,0,
0,1,4,0,0,5,0,0,0,
0,0,0,9,0,3,0,0,0,
0,0,0,8,0,0,9,4,0,
0,0,3,0,0,0,0,6,0,
6,0,0,2,0,0,1,0,0,
8,0,9,0,6,0,0,0,0)
#2.运行函数f_sd()
f_sd(shudu)