- #数独程序说明 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)
来源: http://www.jianshu.com/p/cd69070b910a